Questionnaire design

Welcome to the questionnaire design guide!

An aim of this course is to develop your ability to translate business problems into actionable research questions and to design an adequate research plan to answer these questions. Therefore, you need to be equiped with knowledge on how to create a survey and properly conduct a research.

Generally, what you can expect from the survey design is similar to what one experiences in a relationship. If you try to take more than you commit, it doesn’t work out. Now on a serious note, if you follow guidelines mentioned here, you will certainly avoid usual traps your fellow collegues were caught in.

In a research process, conducting a survey is a part of (primary) data collection. Before we collect data, we have to make sure that preceding steps are correctly done. However, in the following sections we will focus on the process of designing a questionnaire. Eventually, you will be able to collect relevant data and apply appropriate statistical tests.

Questionnaire design process

A structured questionnaire is a research instrument designed to elicit specific information from a sample of a target population. Usually it is used in a standardized way with fixed-alternative questions (same questions and response options for all respondents).

An objective of a questionnaire is threefold:

  • to translate the information need into a set of specific questions that the respondent can and will answer,
  • to motivate, and encourage respondents to become involved, to cooperate, and to complete the questionnaire,
  • to minimize response error.

In order to meet these objectives, a questionnaire design process suggests the following sequence of steps:

Specification of the information needed

The questionnaire design should be aligned with the research design! In order to do make it aligned, it is necessary to review components of the problem and the approach. In particular, you should review the research questions, hypotheses and characteristics that influence the research design.

If you are interested in the causal effect of one particular (independent) variable on another (dependent) variable, think about an experimental design that might allow you to manipulate this variable. In this case, you particularly have to decide on the following:

  • Which variable to manipulate?
  • Whether to use a between-subjects or within-subjects design?
  • The cause-effect sequence (the cause must occur before the effect)
  • The number of experimental conditions
  • Potential interactions and relationships with other variables (does the effect depend on another variable?)

What you need to be careful about is the effect of reversed causation. The effect refers to the situation where the causal relationship could possible have an opposite direction from what we assumed at the first place. For instance, it is often assumed that an increase in individual income leads to increase in well-being (happiness). However, some researches suggest that this causation could have an opposite direction, i.e.Ā that actually increase in well-being of an individual leads to an increase in income.

Here are some examples of causal research design applications:

  • To assess how a product’s country-of-origin impacts attractiveness across different countries.
  • To analyse the effects of rebranding on customer loyalty.

If you would like to analyze the effects of multiple categorical or continuous (independent) variables on one continuous (dependent) variable, you might use a regression model. When doing this, you particularly have to decide on:

  • How to measure the dependent variable (DV). This is particularly important, since you need a variable that is powerful in uncovering variation between subjects (e.g., open-ended questions, such as ā€œHow much are you willing to pay for this productā€ are good candidates). Moreover, you also need to consider the nature of your DV,i.e.Ā whether it is an interval variable, ordinal or categorical variable. The nature of your DV will heavily influence your choice of a correct statistical test.

  • How to measure the independent variables (IV) (single-item vs.Ā multi-item scales, categorical vs.Ā continuous). Bear in mind that the nature of the IV, together with DV, affects your choice of a statistical test as well.

  • What other variables might cause the effect that you would like to investigate (to prevent omitted variable bias, i.e.Ā variables that are not part of your model but still influence the dependent variable).

  • Potential interactions (e.g., is the effect of variable X stronger for group A vs.Ā B?)

Specify the interviewing method

In the next step you should review the type of interviewing method you will use. At this point you need to think in which setting you aim to conduct your survery. For instance, should you do it in a face-to-face setting or rather online. Here you can find some advantages and disadvantages of online surveys:

Additionally, here is the list of the online tools you can use to conduct an online survey (usually for free):

Determine the content of questions

In this step you are starting to work on the content of you questions. There are several questions you should ask yourself when writing questions:

  • Is the question necessary?
  • Will I obtain the needed information?
  • Are several questions needed instead of one?
  • What type of data can I collect by asking that question (categorical or continuious)?

In your survey try to avoid asking double-barrelled questions.Those are a single question that attempts to cover two issues. Such questions can be confusing to respondents and result in ambiguous responses. Instead, you might ask multiple questions in order to obtain the inteded information.

Incorrect:
Do you think Nike Town offers better variety and prices than other Nike stores?

Correct:
Do you think Nike Town offers better variety than other Nike stores?
Do you think Nike Town offers better prices than other Nike stores?

Inability and unwillingness to answer

The quality of collected data you highly depends on your ability to address correct participants. Therefore, you need to make sure that your respondents are able to meaningfully answer your questions.

Examples:

  • Not every household member might be informed about monthly expenses for groceries purchases if someone else makes these purchases.
  • Use filter questions that measure familiarity and product use.
  • Include a ā€œdon’t knowā€ option.
  • If you ask participants for monteray values (e.g.Ā how much are you ready to pay for the XY product?) across several EU, make sure you indicate correct currency (e.g.Ā HRK for Croatia or HUF for Hungary).
  • Think about how mobile friendly is the layout of your survey (if it is an online survey).
  • Good case practices suggest that there should not be more than 2 questions per page (for online surveys displayed on mobile phones).

If you are asking participants to recall certain brands for instance, make sure you use unaided recall question:

Example of unaided recall question:
What brands of soft drinks do you remember being advertised on TV last night?
Example of aided recall question:
Which of these brands were advertised last night on TV?
a) Coca-Cola
b) Pepsi
c) Red Bull
d) Evian
e) Don’t know

If you are asking participants to list something, the good case practice is to minimize the effort required by respondents:

Incorrect:
Please list all the departments from which you purchased merchandise on your most recent shopping trip to department store X.
Correct:
Please check all the departments from which you purchased merchandise on your most recent shopping trip to a department store:
a) Women’s dresses
b) Men’s apparel
c) Children’s apparel
d) Cosmetics
e) Jewelry
f) Other (please specify) ___________

In a case you are asking for information that could be considered sensitive (e.g.Ā money, family life, political beliefs, religion), they should come at the end of the questionnaire. Moreover, it is recommendable to provide response categories rather than asking for specific figures:

Incorrect:
What is your household’s exact annual income?
Correct:
Which one of the following categories best describes your household’s annual gross income?
a) under 25.001 €
b) 25.001€ to 50.000 €
c) 50.001€ to 75.000 €
d) 75.001€ to 100.000 €
e) over 100.000 €

Decide on measurement scales and scaling techniques

Every statistical analysis requires that variables have a specific levels of measurement. Measurement scales you choose for your questions in a survey will affect the answers you get and eventually statistical test you can apply. For instance, it would not make sense to compute an average of genders. An average of a categorical variable does not make much sense. Moreover, if you tried to compute the average of genders defined in numeric values (e.g.Ā male=0, female=1), the output would be interpretable.

Therefore, it is crucial to become familiar with possibilities of each scale before you choose to add another question to your survey. Consequently, chances to obtain data you did not intend to collect and chances that you will not be able to apply tests you intended are significantly lower.

In the following table you can get a quick overview of possibilities per each measurement scale. :

In the table below you can find general procedure for choosing a correct analysis based on the measurement scale of your data and number of variables. It shows statistical analyses we covered during the course and aims to help you choose among them based on the nature of dependent variables on the side, and the nature and the number of your independent variables on the other side:

When it comes to scaling techniques, they are meant to study the relationship between objects. The basic scaling techniques classification is on comparative and non-comparative scales.

The noncomparative scale each object is scaled independently of the other objects. The resulting data is supposed to be measured in an interval and ratio scaled.

Comparative scales (or nonmetric scaling) compare direclty the stimulus object. For example, the respondent might be asked directly about his preference between domestic and foreign beer brands. As a result, the comparative data collected can only be interpreted in relative terms. In the following sections we will walk through both types of comparative scales and briefly introduce them.

Comparative scale: Paired Comparison

  • Respondent is presented with two objects and asked to select one according to some criterion.
  • The nature of resulting data is ordinal
  • Assumption of transitivity (if X > Y and Y > Z, then X > Z) enables the paired comparison data to be converted into a rank order. To do so, you need to indetify the number of times the object is preferred by adding up all the matrices.
  • Effective when the number of objects is limited as it requires the direct comparison, and a bigger number of objects makes the comparison becomes unmanagable.
  • Example:
    For each pair, please indicate which of the two brands of beer in the pair you prefer.

Comparative scale: Rank Order

  • Allow a certain set of brands or products to be simultaneously ranked based upon a specific attribute or characteristic.
  • The rank order scaling is a good proxy for to the shopping setting as there are simultanious comparisons of objects.
  • The rank order scaling results in the data of ordinal nature.
  • Example:
    Rank the various brands of beer in order of preference. Begin by picking out the one brand that you like most and assign it a number 1. Then find the second most preferred brand and assign it a number 2. Continue this procedure until you have ranked all the brands of beer in order of preference. No two brands should received the same rank number.

Comparative scale: Constant sum

  • Respondents allocate a constant sum of units (e.g., points, dollars) among a set of stimulus objects with respect to some criterion.
  • Constant sum is similar to rank order, but it carries specific units.
  • The resulting data does not just indicate important factors, but also by how much a factor supersedes another one.
  • Constant sum scaling can be used to observe the comparative significance respondents assigned to various factors of a subject.
  • Example:
    There are 8 attributes of bottled beers. Please allocate 100 points among the attributes so that your allocation reflects the relative importance you attach to each attribute.

  • Basic analysis of constant-sum data involves tabulation of responses and presenting them as either quantities (e.g., ā€œon average, 7 points were allocated toā€high alcohol levelā€œ), or, as proportions (ā€On average, 7% of points were allocated to ā€œhigh alcohol levelā€).

Non-Comparative Scales: Continuous Rating Scales

  • Participants rate the objects by placing a mark at the appropriate position on a line that runs from one extreme of the criterion variable to the other.
  • One of the advantages of the continuous rating scale is that it is easy to administer.

  • Once the ratings are collected, you can splits up the obtained ratings into categories and then assign those depending on the category in which the ratings fall.

Non-Comparative Scales: Itemized Rating Scales

  • The respondents are provided with a scale that has a number or brief description associated with each category.
  • The categories are ordered in terms of scale position, and the respondents are required to select the specified category that best describes the object being rated.
  • The commonly used itemized rating scales are the Likert, semantic differential and Stapel scales.
Itemized Rating Scales: Likert scale
  • Requires respondents to indicate their attitude towards the given object through the degree of agreement or disagreement with each of a series of statements within typically five or seven categories.
  • Reversed code of some items increases validity.
  • One limitation is time required to answer a question on a Likert scale. Compared to other itemized scaling techniques, Likert scale is more time consuming as each respondent is required to read every statement given in a questionnaire before assigning a numerical value to it.

In the table below you can find a couple of commonly measured constructs in marketing research such as attitude, importance, purchase intention and similar.

Itemized Rating Scales: Semantic Differential
  • Typically, participants rate objects on a number of itemized, seven-point rating scales bounded at each end by one of two bipolar adjectives.

  • Semantic differential can measure respondent attitudes towards something (products,concepts, items, people…).

  • It helps you find the repondent’s position is on a scale between two bipolar adjectives such as ā€œSweet-Sourā€ or ā€œBright-Darkā€. In comparison to Likert scale, which uses generic scales (e.g.Ā extremely dissatisfied to extremely satisfied), semantic differential questions are posed within the context of evaluating attitudes.

  • Widely used rating scale in marketing research due to its versatility

When creating a semantical difference question, you should consider the following:

  • Number of categories:

  • Balanced vs.Ā unbalanced:

  • Odd/even number of categories:

  • Forced vs.Ā non-forced response

  • Verbal description:

Questionnaire structure

The sequnece of questions in a questionnaire could play imporant role. For instance, more sensitive questions (such as demographic-related questions) are usually placed at the end as they can trigger change in respondent’s behavior.

If you plan to conduct an online survey, then you need to think about the respondent’s experience while doing your questionnaire. For instance, spread the content over more short pages and do not have fewer long pages. In online surveys, two questions on one page is a useful rule of thumb. Generally, respondents are reluctant to read and fill out long questionnaire pages. Hence, long pages will lead to a higher dropout rate. In order to reduce dropout rate state how long the survey will approximately take in the introduction of the questionnaire. Take into account that tools like Qualtrics provide the estimated response time in the survey overview.

Consider that the most of people usually use their phones to fill it out. Think about how the questionnaire will appear on a phone screen too. In that regard, think of length of questions especially.

In the end, the questionnaire structure has to be aligned with the research design. For example, if your research design features an experiment, this needs to be reflected in the questionnaire (e.g., you need to assign the respondents randomly to the experimental conditions in case of a between-subjects comparison).

Questionnaire structure for a between-subjects design

In a between-subject design you randomly assign each respondent to different experimental conditions. They would then complete tasks only in the condition to which they are assigned.

For instance, we would like to test the effect of two advertisements on purchase intention. Therefore, one group of (randomly assigned) respondents will be exposed to one advertisement version while the other group (of randomly assigned respondents) will be exposed to another version. After that, both groups of respondents should express their willingness to buy the advertised product. Evenutally, if the dependent variable (e.g.Ā willingness to buy) is measured on interval or ratio scale, then you can use independent t-test to compare group means. The whole experimental design should be organised as following:

Questionnaire structure for a within-subjects design

This type of experimental design involves exposing each respondent to all of the user experimental conditions you’re testing. This way, each respondent will test all of the conditions.

For instance, we would like to test again the effect of two advertisements on purchase intentions, but this time in a within-subject design. First, each respondent will be exposed to the first version of advertisement and right after that asked to rate his/her willingness to buy the advertised product. Subsequently, each participant will be shown another version of advertisement and again rate his/her willingness to purchase the advertised product. Finally, we can compare group means with paired sample t-test (given that data is measured on interval or ratio scale).

Question wording

Generally, question wording should enable each respondent to understand questions and to be able to answer them with reliability. Reliability means that, if a respondent was asked the same question again, he/she would give the same answer again. A number of common problems regarding the question wording have been identified, so we will address the most important ones.

In order to ensure reliability, the issue in terms of who, what, when and where should be defined in each question.
Example: Which brand of shampoo do you use?
Who (the respondent): It is not clear whether this question relates to the individual respondent or the respondent’s total household.
What (the brand of shampoo): It is unclear how the respondent is to answer this question if more than one brand is used.
When (unclear): The time frame is not specified in this question. The respondent could interpret it as meaning the shampoo used this morning, this week, or over the past year.
Where (not specified): At home, at the gym? Where?

A more clearly defined question is:
Which brand or brands of shampoo have you personally used at home during the last month? In the case of more than one brand, please list all the brands that apply.

Use ordinary words. Words should match the vocabulary level of the participants.
Incorrect:
ā€œDo you think the distribution of soft drinks is adequate?ā€
Correct:
ā€œDo you think soft drinks are easily available when you want to buy them?ā€

Avoid double negative form. Double negative question forms can confuse respondents, especially when they need to answer with ā€œAgreeā€ or ā€œDisagreeā€.

Incorrect:
Do you think that it is not uncommon that boys play basketball?
Correct:
In your opinion, is it common that boys play basketball?

Avoid leading questions.Leading questions clue the participant to what the answer should be. Such questions introduce a bias in a particular direction.
Incorrect:
ā€œIs Colgate your favorite toothpaste?ā€
Correct:
ā€œWhat is your favorite brand of toothpaste?ā€

Avoid ambiguous words. Words such as usually, normally, frequently, often, regularly, and other similar words, do not define frequency clearly enough.

Incorrect:
ā€œIn a typically month, how often do you go to a movie theater to see a movie?ā€
a) Never
b) Occasionally
c) Sometimes
d) Often
e) Regularly

Correct:
ā€œIn a typically month, how often do you go to a movie theater to see a movie?ā€
a) Less than once
b) 1 or 2 times
c) 3 or 4 times
d) More than 4 times

Choose adequate order

One of the last steps in a process of designing a questionnaire is choosing adequate order of questions and instructions for respondents.

At the begining, you should provide a short and easy-to-understand introduction to the topic. Use simple language and avoid technical terms (e.g., not many people will know the terms ā€œmanufacturer brandā€ and ā€œstore brandā€). Additionally, in the introduction you should state how long the survey will approximately take.

The opening questions should be interesting, simple and non-threatening. They are crucial because it is the respondent’s first exposure to the questionnaire and is likely to set the tone for the rest of questions in the questionnaire. If too difficult to understand, or sensitive in some way, respondents are likely to stop answering your questions. Qualifying questions (or screening questions) should serve as the opening questions (if applicable). Their purpose is to identify a potential respondent that is eligable to proceed with the research survey.

After the opening part, you should establish an optimal question flow. General questions should precede the specific questions. Questions on one subject, or one particular aspect of a subject, should be grouped together. It may feel confusing to be asked to return to some subject they thought they already gave their opinions about.

As respondents are moving towards the end of the questionnaire, they are likely to become increasingly indifferent and might give careless answers. Therefore, questions of special importance should ideally be included in the earlier part of the questionnaire.

Finally, you should pay particular attention to provide all prescribed definitions and explanations before you ask a question. This ensures that the questions are undestood in consistent way by every respondent.

Test your questionnaire

Finally, before you distribute the final questionnaire, there are some things to consider. First, you should always pretest your questionnaire before sharing it! Test all aspects of the questionnaire (content, wording, sequence, form & layout, etc.). If possible, use respondents in the pretest that are similar to those who will be included in the actual survey. Ideally, the pretest sample size should be small (in a real scenario this could varyfrom 15 to 30 respondents; for the group project, a lower number will be sufficient). After each significant revision of the questionnaire, conduct another pretest, using a different sample of respondents. Eventually, code and analyze the responses obtained from the pretest so that you make sure that you collected information you intended to collect.

After testing your questionnaire you should be able to determine whether:

  • The questions are properly framed
  • The questions wording triggers any biases
  • The questions are placed in the optimal order
  • The questions are understandable
  • Specifying questions are needed or some need to be eliminated

Questionnaire in Qualtrics

A questionnaire creation in Qualtrics starts with creation of a Qulatrics project. Each project consists of a survey, distribution record, and collection of responses and reports. There are three ways to create a questionnaire.First, you can create a new survey project from scratch. Second, you can create a new questionnaire from a copy of an existing questionnaire. Eventually, you can create from a template in your Survey Library, or from an exported QSF file.

In order to create a completely new questionnaire, you need to do the following:

Go to the Projects page by clicking the Qualtric XM logo or clicking Projects on the top-right.

Create new project by clicking the blue button on the right side.
In the ā€œCreate your ownā€ section click on the survey button.

Enter a name for your survey and get started with a survey creation.

If you would like to create a new questionnaire on a basis of an already existing one, then you choose ā€œFrom a Copyā€. Subseqeuntly, you need to indicate the questionnaire you would like to copy. Now you are good to go!

If there is a questionnaire in the Qualtrics Library you would like to use, then you need to choose ā€œFrom Libraryā€, and indicate one library name in the dropdown menu.

Question Types and Data Analysis

In this chapter we will encounter the nature of data you collect when conducting a survey. It will help you choose a type of a question depending on the nature of data you want to collect and on the type of statistical tests you want to apply.

Multiple choice with a single answer

Multiple Choice with a single answer is a type of closed-ended question that lets respondents select one answer from a defined list of choices.

Type of data you obtain is categorical, and the output comes in the following form:

Q5_1 Q5_2 Q5_3 Q5_4 Q5_4_TEXT
NA NA 1 NA
1 NA NA NA
1 NA NA NA
NA NA 1 NA
NA NA NA 1 Vending machines with coffee
1 NA NA NA

Data handling

What to do with this data now? First, we need to load it in R and prepare for analysis. The numbers you see in the output R recognizes as integers. In order to conduct statistical modelling and properly visualize our results, we need to convert our data to a factor class.
A factor (or coding variable) represents different groups of data by using numbers (integers). In fact, factors appear as numeric variables, but they hold meaning of labels/names of data groups, i.e.Ā nominal variable. These data groups are represented in a form of ā€˜levels’.
In our case, our multiple choice question output will contain 4 data groups (ā€˜Grocery Store’, ā€˜Online shop’, ā€˜Specialised coffee shop’, ā€˜other’) after converting it to factor:

# Table
table(qualtrics_long$value)

           Grocery shop             Online shop Specialized coffee shop 
                      6                       6                       2 
                  Other 
                      3 

Visualisation

Second, you might want to visualize your results. In order to do so, the data format needs to be in the appropriate format.Here we proceed with data fromat adaptation from the point where we stopped:

# Converting long format to the visualisation-friendly format
mlc_visualisation <- as.data.frame(table(qualtrics_long$value))

# Naming columns
names(mlc_visualisation) <- c('Place','Count')

# Observing
mlc_visualisation
NA

The simpliest way to visualize data obtained from multiple choice question with a single answer is a bar chart:

## ggplot basic bar chart
labels <- as.character(mlc_visualisation$Place)
barplot(mlc_visualisation$Count, # Column to visualize
        xlab='Places to buy coffee', # X-axis label
        ylab = 'Count(answers)', # Y-axis label
        names.arg = labels,
        main = 'Where do you buy your coffee?') # Title

R package ggplot2 allows you to create visually appealing graphs:

## ggplot2 bar chart
library(ggplot2)
p <- ggplot(data=mlc_visualisation, 
             aes(x=Place, y=Count, fill=Place)) +
             geom_bar(stat='identity') + theme_minimal() # ggplot2 basic barplot
p

Another R library which can help you make amazing interactive charts in a minute is plotly. Here we use a function called ggplotly(), which allows you to turn any ggplot2 chart interactive. Since we have already created a bar chart using ggplot2 and saved it as ā€œpā€, we will just turn it into plotly graph:

library(plotly)
ggplotly(p)

An improved version of ggplot2 package is the packaged called ggvis, which is still in developing:

library(ggvis)
ggvis(mlc_visualisation, 
      x = ~Place, 
      y = ~Count, 
      fill=~Place)

Statistical analysis

LS0tDQp0aXRsZTogIjE4LVF1ZXN0aW9ubmFpcmVfZGVzaWduIg0Kb3V0cHV0Og0KICBwZGZfZG9jdW1lbnQ6DQogICAgdG9jOiB5ZXMNCiAgaHRtbF9ub3RlYm9vazogZGVmYXVsdA0KICBodG1sX2RvY3VtZW50Og0KICAgIHRvYzogeWVzDQogICAgZGZfcHJpbnQ6IHBhZ2VkDQotLS0NCg0KYGBge3IsIGluY2x1ZGU9RkFMU0V9DQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUpDQpgYGANCg0KDQojIFF1ZXN0aW9ubmFpcmUgZGVzaWduICANCldlbGNvbWUgdG8gdGhlIHF1ZXN0aW9ubmFpcmUgZGVzaWduIGd1aWRlIQ0KDQpBbiBhaW0gb2YgdGhpcyBjb3Vyc2UgaXMgdG8gZGV2ZWxvcCB5b3VyIGFiaWxpdHkgdG8gdHJhbnNsYXRlIGJ1c2luZXNzIHByb2JsZW1zIGludG8gYWN0aW9uYWJsZSByZXNlYXJjaCBxdWVzdGlvbnMgYW5kIHRvIGRlc2lnbiBhbiBhZGVxdWF0ZSByZXNlYXJjaCBwbGFuIHRvIGFuc3dlciB0aGVzZSBxdWVzdGlvbnMuIFRoZXJlZm9yZSwgeW91IG5lZWQgdG8gYmUgZXF1aXBlZCB3aXRoIGtub3dsZWRnZSBvbiBob3cgdG8gY3JlYXRlIGEgc3VydmV5IGFuZCBwcm9wZXJseSBjb25kdWN0IGEgcmVzZWFyY2guIA0KDQpHZW5lcmFsbHksIHdoYXQgeW91IGNhbiBleHBlY3QgZnJvbSB0aGUgc3VydmV5IGRlc2lnbiBpcyBzaW1pbGFyIHRvIHdoYXQgb25lIGV4cGVyaWVuY2VzIGluIGEgcmVsYXRpb25zaGlwLiBJZiB5b3UgdHJ5IHRvIHRha2UgbW9yZSB0aGFuIHlvdSBjb21taXQsIGl0IGRvZXNu4oCZdCB3b3JrIG91dC4gTm93IG9uIGEgc2VyaW91cyBub3RlLCBpZiB5b3UgZm9sbG93IGd1aWRlbGluZXMgbWVudGlvbmVkIGhlcmUsIHlvdSB3aWxsIGNlcnRhaW5seSBhdm9pZCB1c3VhbCB0cmFwcyB5b3VyIGZlbGxvdyBjb2xsZWd1ZXMgd2VyZSBjYXVnaHQgaW4uDQoNCkluIGEgcmVzZWFyY2ggcHJvY2VzcywgY29uZHVjdGluZyBhIHN1cnZleSBpcyBhIHBhcnQgb2YgKHByaW1hcnkpIGRhdGEgY29sbGVjdGlvbi4gQmVmb3JlIHdlIGNvbGxlY3QgZGF0YSwgd2UgaGF2ZSB0byBtYWtlIHN1cmUgdGhhdCBwcmVjZWRpbmcgc3RlcHMgYXJlIGNvcnJlY3RseSBkb25lLiBIb3dldmVyLCBpbiB0aGUgZm9sbG93aW5nIHNlY3Rpb25zIHdlIHdpbGwgZm9jdXMgb24gdGhlIHByb2Nlc3Mgb2YgZGVzaWduaW5nIGEgcXVlc3Rpb25uYWlyZS4gRXZlbnR1YWxseSwgeW91IHdpbGwgYmUgYWJsZSB0byBjb2xsZWN0IHJlbGV2YW50IGRhdGEgYW5kIGFwcGx5IGFwcHJvcHJpYXRlIHN0YXRpc3RpY2FsIHRlc3RzLiAgICANCg0KYGBge3IsZWNobz1GQUxTRSxvdXQud2lkdGggPSAnNzAlJyxmaWcuYWxpZ249J2NlbnRlcid9DQprbml0cjo6aW5jbHVkZV9ncmFwaGljcygicmVzZWFyY2gtcHJvY2Vzcy5QTkciKQ0KYGBgDQoNCg0KIyMgUXVlc3Rpb25uYWlyZSBkZXNpZ24gcHJvY2VzcyAgDQpBIHN0cnVjdHVyZWQgcXVlc3Rpb25uYWlyZSBpcyBhIHJlc2VhcmNoIGluc3RydW1lbnQgZGVzaWduZWQgdG8gZWxpY2l0IHNwZWNpZmljIGluZm9ybWF0aW9uIGZyb20gYSBzYW1wbGUgb2YgYSB0YXJnZXQgcG9wdWxhdGlvbi4gVXN1YWxseSBpdCBpcyB1c2VkIGluIGEgc3RhbmRhcmRpemVkIHdheSB3aXRoIGZpeGVkLWFsdGVybmF0aXZlIHF1ZXN0aW9ucyAoc2FtZSBxdWVzdGlvbnMgYW5kIHJlc3BvbnNlIG9wdGlvbnMgZm9yIGFsbCByZXNwb25kZW50cykuDQoNCkFuIG9iamVjdGl2ZSBvZiBhIHF1ZXN0aW9ubmFpcmUgaXMgdGhyZWVmb2xkOg0KDQoqIHRvIHRyYW5zbGF0ZSB0aGUgaW5mb3JtYXRpb24gbmVlZCBpbnRvIGEgc2V0IG9mIHNwZWNpZmljIHF1ZXN0aW9ucyB0aGF0IHRoZSByZXNwb25kZW50IGNhbiBhbmQgd2lsbCBhbnN3ZXIsDQoqIHRvIG1vdGl2YXRlLCBhbmQgZW5jb3VyYWdlIHJlc3BvbmRlbnRzIHRvIGJlY29tZSBpbnZvbHZlZCwgdG8gY29vcGVyYXRlLCBhbmQgdG8gY29tcGxldGUgdGhlIHF1ZXN0aW9ubmFpcmUsDQoqICB0byBtaW5pbWl6ZSByZXNwb25zZSBlcnJvci4NCg0KSW4gb3JkZXIgdG8gbWVldCB0aGVzZSBvYmplY3RpdmVzLCBhIHF1ZXN0aW9ubmFpcmUgZGVzaWduIHByb2Nlc3Mgc3VnZ2VzdHMgdGhlIGZvbGxvd2luZyBzZXF1ZW5jZSBvZiBzdGVwczoNCg0KYGBge3IsZWNobz1GQUxTRSwgb3V0LndpZHRoID0gJzcwJScsZmlnLmFsaWduPSdjZW50ZXInfQ0Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoInF1ZXN0aW9ubmFpcmUtZGVzaWduLXByb2Nlc3MucG5nIikNCmBgYA0KDQojIyMgU3BlY2lmaWNhdGlvbiBvZiB0aGUgaW5mb3JtYXRpb24gbmVlZGVkICANClRoZSBxdWVzdGlvbm5haXJlIGRlc2lnbiBzaG91bGQgYmUgYWxpZ25lZCB3aXRoIHRoZSByZXNlYXJjaCBkZXNpZ24hDQpJbiBvcmRlciB0byBkbyBtYWtlIGl0IGFsaWduZWQsIGl0IGlzIG5lY2Vzc2FyeSB0byByZXZpZXcgY29tcG9uZW50cyBvZiB0aGUgcHJvYmxlbSBhbmQgdGhlIGFwcHJvYWNoLiBJbiBwYXJ0aWN1bGFyLCB5b3Ugc2hvdWxkIHJldmlldyB0aGUgcmVzZWFyY2ggcXVlc3Rpb25zLCBoeXBvdGhlc2VzIGFuZCBjaGFyYWN0ZXJpc3RpY3MgdGhhdCBpbmZsdWVuY2UgdGhlIHJlc2VhcmNoIGRlc2lnbi4gIA0KDQpJZiB5b3UgYXJlIGludGVyZXN0ZWQgaW4gdGhlIGNhdXNhbCBlZmZlY3Qgb2Ygb25lIHBhcnRpY3VsYXIgKGluZGVwZW5kZW50KSB2YXJpYWJsZSBvbiBhbm90aGVyIChkZXBlbmRlbnQpIHZhcmlhYmxlLCB0aGluayBhYm91dCBhbiBleHBlcmltZW50YWwgZGVzaWduIHRoYXQgbWlnaHQgYWxsb3cgeW91IHRvIG1hbmlwdWxhdGUgdGhpcyB2YXJpYWJsZS4gSW4gdGhpcyBjYXNlLCB5b3UgcGFydGljdWxhcmx5IGhhdmUgdG8gZGVjaWRlIG9uIHRoZSBmb2xsb3dpbmc6ICANCg0KKiBXaGljaCB2YXJpYWJsZSB0byBtYW5pcHVsYXRlPyAgDQoqIFdoZXRoZXIgdG8gdXNlIGEgYmV0d2Vlbi1zdWJqZWN0cyBvciB3aXRoaW4tc3ViamVjdHMgZGVzaWduPyAgDQoqIFRoZSBjYXVzZS1lZmZlY3Qgc2VxdWVuY2UgKHRoZSBjYXVzZSBtdXN0IG9jY3VyIGJlZm9yZSB0aGUgZWZmZWN0KSAgDQoqIFRoZSBudW1iZXIgb2YgZXhwZXJpbWVudGFsIGNvbmRpdGlvbnMgIA0KKiBQb3RlbnRpYWwgaW50ZXJhY3Rpb25zIGFuZCByZWxhdGlvbnNoaXBzIHdpdGggb3RoZXIgdmFyaWFibGVzIChkb2VzIHRoZSBlZmZlY3QgZGVwZW5kIG9uIGFub3RoZXIgdmFyaWFibGU/KQ0KDQpXaGF0IHlvdSBuZWVkIHRvIGJlIGNhcmVmdWwgYWJvdXQgaXMgdGhlIGVmZmVjdCBvZiAqKnJldmVyc2VkIGNhdXNhdGlvbioqLiBUaGUgZWZmZWN0IHJlZmVycyB0byB0aGUgc2l0dWF0aW9uIHdoZXJlIHRoZSBjYXVzYWwgcmVsYXRpb25zaGlwIGNvdWxkIHBvc3NpYmxlIGhhdmUgYW4gb3Bwb3NpdGUgZGlyZWN0aW9uIGZyb20gd2hhdCB3ZSBhc3N1bWVkIGF0IHRoZSBmaXJzdCBwbGFjZS4gRm9yIGluc3RhbmNlLCBpdCBpcyBvZnRlbiBhc3N1bWVkIHRoYXQgYW4gaW5jcmVhc2UgaW4gaW5kaXZpZHVhbCBpbmNvbWUgbGVhZHMgdG8gaW5jcmVhc2UgaW4gd2VsbC1iZWluZyAoaGFwcGluZXNzKS4gSG93ZXZlciwgc29tZSBbcmVzZWFyY2hlc10oaHR0cHM6Ly93d3cubmNiaS5ubG0ubmloLmdvdi9wdWJtZWQvMTY5NDk2OTIpIHN1Z2dlc3QgdGhhdCB0aGlzIGNhdXNhdGlvbiBjb3VsZCBoYXZlIGFuIG9wcG9zaXRlIGRpcmVjdGlvbiwgaS5lLiB0aGF0IGFjdHVhbGx5IGluY3JlYXNlIGluIHdlbGwtYmVpbmcgb2YgYW4gaW5kaXZpZHVhbCBsZWFkcyB0byBhbiBpbmNyZWFzZSBpbiBpbmNvbWUuICANCg0KSGVyZSBhcmUgc29tZSBleGFtcGxlcyBvZiBjYXVzYWwgcmVzZWFyY2ggZGVzaWduIGFwcGxpY2F0aW9uczogIA0KDQoqIFRvIGFzc2VzcyBob3cgYSBwcm9kdWN0J3MgY291bnRyeS1vZi1vcmlnaW4gaW1wYWN0cyBhdHRyYWN0aXZlbmVzcyBhY3Jvc3MgZGlmZmVyZW50IGNvdW50cmllcy4gIA0KKiBUbyBhbmFseXNlIHRoZSBlZmZlY3RzIG9mIHJlYnJhbmRpbmcgb24gY3VzdG9tZXIgbG95YWx0eS4gIA0KDQpgYGB7cixlY2hvPUZBTFNFLCBvdXQud2lkdGggPSAnNzAlJyxmaWcuYWxpZ249J2NlbnRlcid9DQprbml0cjo6aW5jbHVkZV9ncmFwaGljcygiY2F1c2F0aW9uLWVmZmVjdC5wbmciKQ0KYGBgDQoNCg0KSWYgeW91IHdvdWxkIGxpa2UgdG8gYW5hbHl6ZSB0aGUgZWZmZWN0cyBvZiBtdWx0aXBsZSBjYXRlZ29yaWNhbCBvciBjb250aW51b3VzIChpbmRlcGVuZGVudCkgdmFyaWFibGVzIG9uIG9uZSBjb250aW51b3VzIChkZXBlbmRlbnQpIHZhcmlhYmxlLCB5b3UgbWlnaHQgdXNlIGEgcmVncmVzc2lvbiBtb2RlbC4gV2hlbiBkb2luZyB0aGlzLCB5b3UgcGFydGljdWxhcmx5IGhhdmUgdG8gZGVjaWRlIG9uOiAgDQoNCiogSG93IHRvIG1lYXN1cmUgKip0aGUgZGVwZW5kZW50IHZhcmlhYmxlIChEVikqKi4gVGhpcyBpcyBwYXJ0aWN1bGFybHkgaW1wb3J0YW50LCBzaW5jZSB5b3UgbmVlZCBhIHZhcmlhYmxlIHRoYXQgaXMgcG93ZXJmdWwgaW4gdW5jb3ZlcmluZyB2YXJpYXRpb24gYmV0d2VlbiBzdWJqZWN0cyAoZS5nLiwgb3Blbi1lbmRlZCBxdWVzdGlvbnMsIHN1Y2ggYXMgIkhvdyBtdWNoIGFyZSB5b3Ugd2lsbGluZyB0byBwYXkgZm9yIHRoaXMgcHJvZHVjdCIgYXJlIGdvb2QgY2FuZGlkYXRlcykuIE1vcmVvdmVyLCB5b3UgYWxzbyBuZWVkIHRvIGNvbnNpZGVyIHRoZSBuYXR1cmUgb2YgeW91ciBEVixpLmUuIHdoZXRoZXIgaXQgaXMgYW4gaW50ZXJ2YWwgdmFyaWFibGUsIG9yZGluYWwgb3IgY2F0ZWdvcmljYWwgdmFyaWFibGUuIFRoZSBuYXR1cmUgb2YgeW91ciBEViB3aWxsIGhlYXZpbHkgaW5mbHVlbmNlIHlvdXIgY2hvaWNlIG9mIGEgY29ycmVjdCBzdGF0aXN0aWNhbCB0ZXN0Lg0KDQoqIEhvdyB0byBtZWFzdXJlICoqdGhlIGluZGVwZW5kZW50IHZhcmlhYmxlcyAoSVYpKiogKHNpbmdsZS1pdGVtIHZzLiBtdWx0aS1pdGVtIHNjYWxlcywgY2F0ZWdvcmljYWwgdnMuIGNvbnRpbnVvdXMpLiBCZWFyIGluIG1pbmQgdGhhdCB0aGUgbmF0dXJlIG9mIHRoZSBJViwgdG9nZXRoZXIgd2l0aCBEViwgYWZmZWN0cyB5b3VyIGNob2ljZSBvZiBhIHN0YXRpc3RpY2FsIHRlc3QgYXMgd2VsbC4gIA0KDQoqIFdoYXQgb3RoZXIgdmFyaWFibGVzIG1pZ2h0IGNhdXNlIHRoZSBlZmZlY3QgdGhhdCB5b3Ugd291bGQgbGlrZSB0byBpbnZlc3RpZ2F0ZSAodG8gcHJldmVudCBvbWl0dGVkIHZhcmlhYmxlIGJpYXMsIGkuZS4gdmFyaWFibGVzIHRoYXQgYXJlIG5vdCBwYXJ0IG9mIHlvdXIgbW9kZWwgYnV0IHN0aWxsIGluZmx1ZW5jZSB0aGUgZGVwZW5kZW50IHZhcmlhYmxlKS4NCg0KKiBQb3RlbnRpYWwgaW50ZXJhY3Rpb25zIChlLmcuLCBpcyB0aGUgZWZmZWN0IG9mIHZhcmlhYmxlIFggc3Ryb25nZXIgZm9yIGdyb3VwIEEgdnMuIEI/KQ0KDQoNCmBgYHtyLCBlY2hvPUZBTFNFLCBvdXQud2lkdGggPSAnNzAlJyxmaWcuYWxpZ249J2NlbnRlcid9DQprbml0cjo6aW5jbHVkZV9ncmFwaGljcygibWxwLXJlZ3Jlc3Npb24ucG5nIikNCmBgYA0KDQojIyMgU3BlY2lmeSB0aGUgaW50ZXJ2aWV3aW5nIG1ldGhvZCAgDQpJbiB0aGUgbmV4dCBzdGVwIHlvdSBzaG91bGQgcmV2aWV3IHRoZSB0eXBlIG9mIGludGVydmlld2luZyBtZXRob2QgeW91IHdpbGwgdXNlLg0KQXQgdGhpcyBwb2ludCB5b3UgbmVlZCB0byB0aGluayBpbiB3aGljaCBzZXR0aW5nIHlvdSBhaW0gdG8gY29uZHVjdCB5b3VyIHN1cnZlcnkuIEZvciBpbnN0YW5jZSwgc2hvdWxkIHlvdSBkbyBpdCBpbiBhIGZhY2UtdG8tZmFjZSBzZXR0aW5nIG9yIHJhdGhlciBvbmxpbmUuIEhlcmUgeW91IGNhbiBmaW5kIHNvbWUgYWR2YW50YWdlcyBhbmQgZGlzYWR2YW50YWdlcyBvZiBvbmxpbmUgc3VydmV5czoNCmBgYHtyLCBlY2hvPUYsIGZpZy5hbGlnbj0nY2VudGVyJyxvdXQud2lkdGg9JzUwJSd9DQprbml0cjo6aW5jbHVkZV9ncmFwaGljcygiYWR2LWRpc2Fkdi1vbmxpbmUtcXVlc3Rpb25uYWlyZS5wbmciKQ0KYGBgDQoNCkFkZGl0aW9uYWxseSwgaGVyZSBpcyB0aGUgbGlzdCBvZiB0aGUgb25saW5lIHRvb2xzIHlvdSBjYW4gdXNlIHRvIGNvbmR1Y3QgYW4gb25saW5lIHN1cnZleSAodXN1YWxseSBmb3IgZnJlZSk6ICANCg0KLSBbUXVhbHRyaWNzXShodHRwOi8vd3d3LnF1YWx0cmljcy5jb20vZnJlZS1hY2NvdW50LykNCi0gW0dvb2dsZSBmb3JtXShodHRwczovL3d3dy5nb29nbGUuY29tL2Zvcm1zL2Fib3V0LykNCi0gW1N1cnZleSBtb25rZXldKGh0dHBzOi8vd3d3LnN1cnZleW1vbmtleS5jb20vKQ0KLSBbRnJlZSBvbmxpbmUgc3VydmVyeXNdKGh0dHA6Ly9mcmVlb25saW5lc3VydmV5cy5jb20vKQ0KLSBbS3dpayBzdXJ2ZXlzXShodHRwOi8va3dpa3N1cnZleXMuY29tLykNCg0KIyMjIERldGVybWluZSB0aGUgY29udGVudCBvZiBxdWVzdGlvbnMgIA0KSW4gdGhpcyBzdGVwIHlvdSBhcmUgc3RhcnRpbmcgdG8gd29yayBvbiB0aGUgY29udGVudCBvZiB5b3UgcXVlc3Rpb25zLiBUaGVyZSBhcmUgc2V2ZXJhbCBxdWVzdGlvbnMgeW91IHNob3VsZCBhc2sgeW91cnNlbGYgd2hlbiB3cml0aW5nIHF1ZXN0aW9uczogIA0KDQoqIElzIHRoZSBxdWVzdGlvbiBuZWNlc3Nhcnk/DQoqIFdpbGwgSSBvYnRhaW4gdGhlIG5lZWRlZCBpbmZvcm1hdGlvbj8gIA0KKiBBcmUgc2V2ZXJhbCBxdWVzdGlvbnMgbmVlZGVkIGluc3RlYWQgb2Ygb25lPyAgDQoqIFdoYXQgdHlwZSBvZiBkYXRhIGNhbiBJIGNvbGxlY3QgYnkgYXNraW5nIHRoYXQgcXVlc3Rpb24gKGNhdGVnb3JpY2FsIG9yIGNvbnRpbnVpb3VzKT8gIA0KDQpJbiB5b3VyIHN1cnZleSB0cnkgdG8gYXZvaWQgYXNraW5nICoqZG91YmxlLWJhcnJlbGxlZCBxdWVzdGlvbnMuKipUaG9zZSBhcmUgDQphIHNpbmdsZSBxdWVzdGlvbiB0aGF0IGF0dGVtcHRzIHRvIGNvdmVyIHR3byBpc3N1ZXMuIFN1Y2ggcXVlc3Rpb25zIGNhbiBiZSBjb25mdXNpbmcgdG8gcmVzcG9uZGVudHMgYW5kIHJlc3VsdCBpbiBhbWJpZ3VvdXMgcmVzcG9uc2VzLiBJbnN0ZWFkLCB5b3UgbWlnaHQgYXNrIG11bHRpcGxlIHF1ZXN0aW9ucyBpbiBvcmRlciB0byBvYnRhaW4gdGhlIGludGVkZWQgaW5mb3JtYXRpb24uICANCg0KPHNwYW4gc3R5bGU9ImNvbG9yOiByZWQ7Ij48Qj5JbmNvcnJlY3Q6PC9CPjwvc3Bhbj4gIA0KRG8geW91IHRoaW5rIE5pa2UgVG93biBvZmZlcnMgYmV0dGVyIHZhcmlldHkgYW5kIHByaWNlcyB0aGFuIG90aGVyIE5pa2Ugc3RvcmVzPyAgICANCg0KPHNwYW4gc3R5bGU9ImNvbG9yOiBncmVlbjsiPjxCPkNvcnJlY3Q6PC9CPjwvc3Bhbj4gIA0KRG8geW91IHRoaW5rIE5pa2UgVG93biBvZmZlcnMgYmV0dGVyIHZhcmlldHkgdGhhbiBvdGhlciBOaWtlIHN0b3Jlcz8gIA0KRG8geW91IHRoaW5rIE5pa2UgVG93biBvZmZlcnMgYmV0dGVyIHByaWNlcyB0aGFuIG90aGVyIE5pa2Ugc3RvcmVzPw0KICAgICAgICAgICANCiMjIyBJbmFiaWxpdHkgYW5kIHVud2lsbGluZ25lc3MgdG8gYW5zd2VyICANClRoZSBxdWFsaXR5IG9mIGNvbGxlY3RlZCBkYXRhIHlvdSBoaWdobHkgZGVwZW5kcyBvbiB5b3VyIGFiaWxpdHkgdG8gYWRkcmVzcyBjb3JyZWN0IHBhcnRpY2lwYW50cy4gVGhlcmVmb3JlLCB5b3UgbmVlZCB0byBtYWtlIHN1cmUgdGhhdCB5b3VyIHJlc3BvbmRlbnRzIGFyZSBhYmxlIHRvIG1lYW5pbmdmdWxseSBhbnN3ZXIgeW91ciBxdWVzdGlvbnMuICAgDQoNCkV4YW1wbGVzOiAgDQoNCiogTm90IGV2ZXJ5IGhvdXNlaG9sZCBtZW1iZXIgbWlnaHQgYmUgaW5mb3JtZWQgYWJvdXQgbW9udGhseSBleHBlbnNlcyBmb3IgZ3JvY2VyaWVzIHB1cmNoYXNlcyBpZiBzb21lb25lIGVsc2UgbWFrZXMgdGhlc2UgcHVyY2hhc2VzLiAgIA0KKiBVc2UgZmlsdGVyIHF1ZXN0aW9ucyB0aGF0IG1lYXN1cmUgZmFtaWxpYXJpdHkgYW5kIHByb2R1Y3QgdXNlLiAgDQoqIEluY2x1ZGUgYSDigJxkb27igJl0IGtub3figJ0gb3B0aW9uLiAgDQoqIElmIHlvdSBhc2sgcGFydGljaXBhbnRzIGZvciBtb250ZXJheSB2YWx1ZXMgKGUuZy4gaG93IG11Y2ggYXJlIHlvdSByZWFkeSB0byBwYXkgZm9yIHRoZSBYWSBwcm9kdWN0PykgYWNyb3NzIHNldmVyYWwgRVUsIG1ha2Ugc3VyZSB5b3UgaW5kaWNhdGUgY29ycmVjdCBjdXJyZW5jeSAoZS5nLiBIUksgZm9yIENyb2F0aWEgb3IgSFVGIGZvciBIdW5nYXJ5KS4gIA0KKiBUaGluayBhYm91dCBob3cgbW9iaWxlIGZyaWVuZGx5IGlzIHRoZSBsYXlvdXQgb2YgeW91ciBzdXJ2ZXkgKGlmIGl0IGlzIGFuIG9ubGluZSBzdXJ2ZXkpLg0KKiBHb29kIGNhc2UgcHJhY3RpY2VzIHN1Z2dlc3QgdGhhdCB0aGVyZSBzaG91bGQgbm90IGJlIG1vcmUgdGhhbiAyIHF1ZXN0aW9ucyBwZXIgcGFnZSAoZm9yIG9ubGluZSBzdXJ2ZXlzIGRpc3BsYXllZCBvbiBtb2JpbGUgcGhvbmVzKS4NCg0KDQoNCklmIHlvdSBhcmUgYXNraW5nIHBhcnRpY2lwYW50cyB0byByZWNhbGwgY2VydGFpbiBicmFuZHMgZm9yIGluc3RhbmNlLCBtYWtlIHN1cmUgeW91IHVzZSAqKnVuYWlkZWQgcmVjYWxsIHF1ZXN0aW9uOioqICANCg0KPHNwYW4gc3R5bGU9ImNvbG9yOiBncmVlbjsiPjxCPkV4YW1wbGUgb2YgdW5haWRlZCByZWNhbGwgcXVlc3Rpb246PC9CPjwvc3Bhbj4gIA0KV2hhdCBicmFuZHMgb2Ygc29mdCBkcmlua3MgZG8geW91IHJlbWVtYmVyIGJlaW5nIGFkdmVydGlzZWQgb24gVFYgbGFzdCBuaWdodD8gIA0KPHNwYW4gc3R5bGU9ImNvbG9yOiByZWQ7Ij48Qj5FeGFtcGxlIG9mIGFpZGVkIHJlY2FsbCBxdWVzdGlvbjo8L0I+PC9zcGFuPiAgDQpXaGljaCBvZiB0aGVzZSBicmFuZHMgd2VyZSBhZHZlcnRpc2VkIGxhc3QgbmlnaHQgb24gVFY/ICANCmEpIENvY2EtQ29sYSAgDQpiKSBQZXBzaSAgDQpjKSBSZWQgQnVsbCAgICAgICAgDQpkKSBFdmlhbiAgICAgDQplKSBEb27igJl0IGtub3cNCg0KDQoNCklmIHlvdSBhcmUgYXNraW5nIHBhcnRpY2lwYW50cyB0byBsaXN0IHNvbWV0aGluZywgdGhlIGdvb2QgY2FzZSBwcmFjdGljZSBpcyAqKnRvIG1pbmltaXplIHRoZSBlZmZvcnQgcmVxdWlyZWQgYnkgcmVzcG9uZGVudHM6KiogIA0KDQo8c3BhbiBzdHlsZT0iY29sb3I6IHJlZDsiPjxCPkluY29ycmVjdDo8L0I+PC9zcGFuPiAgICAgDQpQbGVhc2UgbGlzdCBhbGwgdGhlIGRlcGFydG1lbnRzIGZyb20gd2hpY2ggeW91IHB1cmNoYXNlZCBtZXJjaGFuZGlzZSBvbiB5b3VyIG1vc3QgcmVjZW50IHNob3BwaW5nIHRyaXAgdG8gZGVwYXJ0bWVudCBzdG9yZSBYLiAgICANCjxzcGFuIHN0eWxlPSJjb2xvcjogZ3JlZW47Ij48Qj5Db3JyZWN0OjwvQj48L3NwYW4+ICAgICANClBsZWFzZSBjaGVjayBhbGwgdGhlIGRlcGFydG1lbnRzIGZyb20gd2hpY2ggeW91IHB1cmNoYXNlZCBtZXJjaGFuZGlzZSBvbiB5b3VyIG1vc3QgcmVjZW50IHNob3BwaW5nIHRyaXAgdG8gYSBkZXBhcnRtZW50IHN0b3JlOiAgICANCmEpIFdvbWVu4oCZcyBkcmVzc2VzICANCmIpIE1lbuKAmXMgYXBwYXJlbCAgDQpjKSBDaGlsZHJlbuKAmXMgYXBwYXJlbCAgDQpkKSBDb3NtZXRpY3MgIA0KZSkgSmV3ZWxyeSAgICANCmYpIE90aGVyIChwbGVhc2Ugc3BlY2lmeSkgX19fX19fX19fX18NCg0KDQpJbiBhIGNhc2UgeW91IGFyZSBhc2tpbmcgZm9yIGluZm9ybWF0aW9uIHRoYXQgY291bGQgYmUgY29uc2lkZXJlZCBzZW5zaXRpdmUgKGUuZy4gbW9uZXksIGZhbWlseSBsaWZlLCBwb2xpdGljYWwgYmVsaWVmcywgcmVsaWdpb24pLCB0aGV5IHNob3VsZCBjb21lIGF0IHRoZSBlbmQgb2YgdGhlIHF1ZXN0aW9ubmFpcmUuIE1vcmVvdmVyLCBpdCBpcyByZWNvbW1lbmRhYmxlIHRvIHByb3ZpZGUgcmVzcG9uc2UgY2F0ZWdvcmllcyByYXRoZXIgdGhhbiBhc2tpbmcgZm9yIHNwZWNpZmljIGZpZ3VyZXM6ICANCg0KPHNwYW4gc3R5bGU9ImNvbG9yOiByZWQ7Ij48Qj5JbmNvcnJlY3Q6PC9CPjwvc3Bhbj4gICAgICAgICANCldoYXQgaXMgeW91ciBob3VzZWhvbGTigJlzIGV4YWN0IGFubnVhbCBpbmNvbWU/ICAgICAgDQo8c3BhbiBzdHlsZT0iY29sb3I6IGdyZWVuOyI+PEI+Q29ycmVjdDo8L0I+PC9zcGFuPiAgICAgICAgICAgDQpXaGljaCBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXRlZ29yaWVzIGJlc3QgZGVzY3JpYmVzIHlvdXIgaG91c2Vob2xk4oCZcyBhbm51YWwgZ3Jvc3MgaW5jb21lPyAgICANCmEpIHVuZGVyIDI1LjAwMSDigqwgICAgDQpiKSAyNS4wMDHigqwgdG8gNTAuMDAwIOKCrCAgICANCmMpIDUwLjAwMeKCrCB0byA3NS4wMDAg4oKsICAgIA0KZCkgNzUuMDAx4oKsIHRvIDEwMC4wMDAg4oKsICAgDQplKSBvdmVyIDEwMC4wMDAg4oKsICAgDQoNCiMjIyBEZWNpZGUgb24gbWVhc3VyZW1lbnQgc2NhbGVzIGFuZCBzY2FsaW5nIHRlY2huaXF1ZXMNCkV2ZXJ5IHN0YXRpc3RpY2FsIGFuYWx5c2lzIHJlcXVpcmVzIHRoYXQgdmFyaWFibGVzIGhhdmUgYSBzcGVjaWZpYyBsZXZlbHMgb2YgbWVhc3VyZW1lbnQuIE1lYXN1cmVtZW50IHNjYWxlcyB5b3UgY2hvb3NlIGZvciB5b3VyIHF1ZXN0aW9ucyBpbiBhIHN1cnZleSB3aWxsIGFmZmVjdCB0aGUgYW5zd2VycyB5b3UgZ2V0IGFuZCBldmVudHVhbGx5IHN0YXRpc3RpY2FsIHRlc3QgeW91IGNhbiBhcHBseS4NCkZvciBpbnN0YW5jZSwgaXQgd291bGQgbm90IG1ha2Ugc2Vuc2UgdG8gY29tcHV0ZSBhbiBhdmVyYWdlIG9mIGdlbmRlcnMuIEFuIGF2ZXJhZ2Ugb2YgYSBjYXRlZ29yaWNhbCB2YXJpYWJsZSBkb2VzIG5vdCBtYWtlIG11Y2ggc2Vuc2UuIE1vcmVvdmVyLCBpZiB5b3UgdHJpZWQgdG8gY29tcHV0ZSB0aGUgYXZlcmFnZSBvZiBnZW5kZXJzIGRlZmluZWQgaW4gbnVtZXJpYyB2YWx1ZXMgKGUuZy4gbWFsZT0wLCBmZW1hbGU9MSksIHRoZSBvdXRwdXQgd291bGQgYmUgaW50ZXJwcmV0YWJsZS4NCg0KVGhlcmVmb3JlLCBpdCBpcyBjcnVjaWFsIHRvIGJlY29tZSBmYW1pbGlhciB3aXRoIHBvc3NpYmlsaXRpZXMgb2YgZWFjaCBzY2FsZSAqKmJlZm9yZSoqIHlvdSBjaG9vc2UgdG8gYWRkIGFub3RoZXIgcXVlc3Rpb24gdG8geW91ciBzdXJ2ZXkuIENvbnNlcXVlbnRseSwgY2hhbmNlcyB0byBvYnRhaW4gZGF0YSB5b3UgZGlkIG5vdCBpbnRlbmQgdG8gY29sbGVjdCBhbmQgY2hhbmNlcyB0aGF0IHlvdSB3aWxsIG5vdCBiZSBhYmxlIHRvIGFwcGx5IHRlc3RzIHlvdSBpbnRlbmRlZCBhcmUgc2lnbmlmaWNhbnRseSBsb3dlci4NCg0KSW4gdGhlIGZvbGxvd2luZyB0YWJsZSB5b3UgY2FuIGdldCBhIHF1aWNrIG92ZXJ2aWV3IG9mIHBvc3NpYmlsaXRpZXMgcGVyIGVhY2ggbWVhc3VyZW1lbnQgc2NhbGUuIDoNCg0KYGBge3IsIGVjaG89RkFMU0UsIG91dC53aWR0aCA9ICc5MCUnLGZpZy5hbGlnbj0nY2VudGVyJ30NCmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKCJtZWFzdXJlbWVudC1zY2FsZS5wbmciKQ0KYGBgDQoNCkluIHRoZSB0YWJsZSBiZWxvdyB5b3UgY2FuIGZpbmQgZ2VuZXJhbCBwcm9jZWR1cmUgZm9yIGNob29zaW5nIGEgY29ycmVjdCBhbmFseXNpcyBiYXNlZCBvbiB0aGUgbWVhc3VyZW1lbnQgc2NhbGUgb2YgeW91ciBkYXRhIGFuZCBudW1iZXIgb2YgdmFyaWFibGVzLiBJdCBzaG93cyBzdGF0aXN0aWNhbCBhbmFseXNlcyB3ZSBjb3ZlcmVkIGR1cmluZyB0aGUgY291cnNlIGFuZCBhaW1zIHRvIGhlbHAgeW91IGNob29zZSBhbW9uZyB0aGVtIGJhc2VkIG9uIHRoZSBuYXR1cmUgb2YgZGVwZW5kZW50IHZhcmlhYmxlcyBvbiB0aGUgc2lkZSwgYW5kIHRoZSBuYXR1cmUgYW5kIHRoZSBudW1iZXIgb2YgeW91ciBpbmRlcGVuZGVudCB2YXJpYWJsZXMgb24gdGhlIG90aGVyIHNpZGU6IA0KDQpgYGB7ciwgZWNobz1GQUxTRSwgb3V0LndpZHRoID0gJzkwJScsZmlnLmFsaWduPSdjZW50ZXInfQ0Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoIm92ZXJ2aWV3LXN0YXRpc3RpY2FsLXRlc3QuanBnIikNCmBgYA0KDQpXaGVuIGl0IGNvbWVzIHRvIHNjYWxpbmcgdGVjaG5pcXVlcywgdGhleSBhcmUgbWVhbnQgdG8gc3R1ZHkgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIG9iamVjdHMuIFRoZSBiYXNpYyBzY2FsaW5nIHRlY2huaXF1ZXMgY2xhc3NpZmljYXRpb24gaXMgb24gKipjb21wYXJhdGl2ZSoqIGFuZCAqKm5vbi1jb21wYXJhdGl2ZSBzY2FsZXMqKi4gDQoNCmBgYHtyLCBlY2hvPUZBTFNFLCBvdXQud2lkdGggPSAnOTAlJyxmaWcuYWxpZ249J2NlbnRlcid9DQprbml0cjo6aW5jbHVkZV9ncmFwaGljcygic2NhbGVzLnBuZyIpDQpgYGANCg0KKipUaGUgbm9uY29tcGFyYXRpdmUgc2NhbGUqKiBlYWNoIG9iamVjdCBpcyBzY2FsZWQgaW5kZXBlbmRlbnRseSBvZiB0aGUgb3RoZXIgb2JqZWN0cy4gVGhlIHJlc3VsdGluZyBkYXRhIGlzIHN1cHBvc2VkIHRvIGJlIG1lYXN1cmVkIGluIGFuIGludGVydmFsIGFuZCByYXRpbyBzY2FsZWQuDQoNCioqQ29tcGFyYXRpdmUgc2NhbGVzIChvciBub25tZXRyaWMgc2NhbGluZykqKiBjb21wYXJlIGRpcmVjbHR5IHRoZSBzdGltdWx1cyBvYmplY3QuIEZvciBleGFtcGxlLCB0aGUgcmVzcG9uZGVudCBtaWdodCBiZSBhc2tlZCBkaXJlY3RseSBhYm91dCBoaXMgcHJlZmVyZW5jZSBiZXR3ZWVuIGRvbWVzdGljIGFuZCBmb3JlaWduIGJlZXIgYnJhbmRzLiBBcyBhIHJlc3VsdCwgdGhlIGNvbXBhcmF0aXZlIGRhdGEgY29sbGVjdGVkIGNhbiBvbmx5IGJlIGludGVycHJldGVkIGluIHJlbGF0aXZlIHRlcm1zLiBJbiB0aGUgZm9sbG93aW5nIHNlY3Rpb25zIHdlIHdpbGwgd2FsayB0aHJvdWdoIGJvdGggdHlwZXMgb2YgY29tcGFyYXRpdmUgc2NhbGVzIGFuZCBicmllZmx5IGludHJvZHVjZSB0aGVtLg0KDQoNCiMjIyMgQ29tcGFyYXRpdmUgc2NhbGU6IFBhaXJlZCBDb21wYXJpc29uICAgIA0KDQoqIFJlc3BvbmRlbnQgaXMgcHJlc2VudGVkIHdpdGggdHdvIG9iamVjdHMgYW5kIGFza2VkIHRvIHNlbGVjdCBvbmUgYWNjb3JkaW5nIHRvIHNvbWUgY3JpdGVyaW9uLg0KKiBUaGUgbmF0dXJlIG9mIHJlc3VsdGluZyBkYXRhIGlzIG9yZGluYWwNCiogQXNzdW1wdGlvbiBvZiB0cmFuc2l0aXZpdHkgKGlmIFggPiBZIGFuZCBZID4gWiwgdGhlbiBYID4gWikgZW5hYmxlcyB0aGUgcGFpcmVkIGNvbXBhcmlzb24gZGF0YSB0byBiZSBjb252ZXJ0ZWQgaW50byBhIHJhbmsgb3JkZXIuIFRvIGRvIHNvLCB5b3UgbmVlZCB0byBpbmRldGlmeSB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBvYmplY3QgaXMgcHJlZmVycmVkIGJ5IGFkZGluZyB1cCBhbGwgdGhlIG1hdHJpY2VzLg0KKiBFZmZlY3RpdmUgd2hlbiB0aGUgbnVtYmVyIG9mIG9iamVjdHMgaXMgbGltaXRlZCBhcyBpdCByZXF1aXJlcyB0aGUgZGlyZWN0IGNvbXBhcmlzb24sIGFuZCBhIGJpZ2dlciBudW1iZXIgb2Ygb2JqZWN0cyBtYWtlcyB0aGUgY29tcGFyaXNvbiBiZWNvbWVzIHVubWFuYWdhYmxlLg0KKiAqRXhhbXBsZToqICANCkZvciBlYWNoIHBhaXIsIHBsZWFzZSBpbmRpY2F0ZSB3aGljaCBvZiB0aGUgdHdvIGJyYW5kcyBvZiBiZWVyIGluIHRoZSBwYWlyIHlvdSBwcmVmZXIuDQpgYGB7ciwgZWNobz1GQUxTRSwgZmlnLmFsaWduPSdjZW50ZXInLCBvdXQud2lkdGg9JzkwJSd9DQprbml0cjo6aW5jbHVkZV9ncmFwaGljcygncGFpcmVkIGNvbXBhcmlzb24ucG5nJykNCmBgYA0KDQojIyMjIENvbXBhcmF0aXZlIHNjYWxlOiBSYW5rIE9yZGVyICANCg0KKiBBbGxvdyBhIGNlcnRhaW4gc2V0IG9mIGJyYW5kcyBvciBwcm9kdWN0cyB0byBiZSBzaW11bHRhbmVvdXNseSByYW5rZWQgYmFzZWQgdXBvbiBhIHNwZWNpZmljIGF0dHJpYnV0ZSBvciBjaGFyYWN0ZXJpc3RpYy4NCiogVGhlIHJhbmsgb3JkZXIgc2NhbGluZyBpcyBhIGdvb2QgcHJveHkgZm9yIHRvIHRoZSBzaG9wcGluZyBzZXR0aW5nIGFzIHRoZXJlIGFyZSBzaW11bHRhbmlvdXMgY29tcGFyaXNvbnMgb2Ygb2JqZWN0cy4NCiogVGhlIHJhbmsgb3JkZXIgc2NhbGluZyByZXN1bHRzIGluIHRoZSBkYXRhIG9mIG9yZGluYWwgbmF0dXJlLg0KKiAqRXhhbXBsZToqICANClJhbmsgdGhlIHZhcmlvdXMgYnJhbmRzIG9mIGJlZXIgaW4gb3JkZXIgb2YgcHJlZmVyZW5jZS4gQmVnaW4gYnkgcGlja2luZyBvdXQgdGhlIG9uZSBicmFuZCB0aGF0IHlvdSBsaWtlIG1vc3QgYW5kIGFzc2lnbiBpdCBhIG51bWJlciAxLiBUaGVuIGZpbmQgdGhlIHNlY29uZCBtb3N0IHByZWZlcnJlZCBicmFuZCBhbmQgYXNzaWduIGl0IGEgbnVtYmVyIDIuIENvbnRpbnVlIHRoaXMgcHJvY2VkdXJlIHVudGlsIHlvdSBoYXZlIHJhbmtlZCBhbGwgdGhlIGJyYW5kcyBvZiBiZWVyIGluIG9yZGVyIG9mIHByZWZlcmVuY2UuDQpObyB0d28gYnJhbmRzIHNob3VsZCByZWNlaXZlZCB0aGUgc2FtZSByYW5rIG51bWJlci4NCg0KYGBge3IsIGVjaG89RiwgZmlnLmFsaWduPSdjZW50ZXInLG91dC53aWR0aD0nNTAlJ30NCmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKCdyYW5rLW9yZGVyLXNjYWxlLnBuZycpDQpgYGANCg0KIyMjIyBDb21wYXJhdGl2ZSBzY2FsZTogQ29uc3RhbnQgc3VtICANCg0KKiBSZXNwb25kZW50cyBhbGxvY2F0ZSBhIGNvbnN0YW50IHN1bSBvZiB1bml0cyAoZS5nLiwgcG9pbnRzLCBkb2xsYXJzKSBhbW9uZyBhIHNldCBvZiBzdGltdWx1cyBvYmplY3RzIHdpdGggcmVzcGVjdCB0byBzb21lIGNyaXRlcmlvbi4gIA0KKiBDb25zdGFudCBzdW0gaXMgc2ltaWxhciB0byByYW5rIG9yZGVyLCBidXQgaXQgY2FycmllcyBzcGVjaWZpYyB1bml0cy4gIA0KKiBUaGUgcmVzdWx0aW5nIGRhdGEgZG9lcyBub3QganVzdCBpbmRpY2F0ZSBpbXBvcnRhbnQgZmFjdG9ycywgYnV0IGFsc28gYnkgaG93IG11Y2ggYSBmYWN0b3Igc3VwZXJzZWRlcyBhbm90aGVyIG9uZS4gIA0KKiBDb25zdGFudCBzdW0gc2NhbGluZyBjYW4gYmUgdXNlZCB0byBvYnNlcnZlIHRoZSBjb21wYXJhdGl2ZSBzaWduaWZpY2FuY2UgcmVzcG9uZGVudHMgYXNzaWduZWQgdG8gdmFyaW91cyBmYWN0b3JzIG9mIGEgc3ViamVjdC4gIA0KKiAqRXhhbXBsZToqICANClRoZXJlIGFyZSA4IGF0dHJpYnV0ZXMgb2YgYm90dGxlZCBiZWVycy4gUGxlYXNlIGFsbG9jYXRlIDEwMCBwb2ludHMgYW1vbmcgdGhlIGF0dHJpYnV0ZXMgc28gdGhhdCB5b3VyIGFsbG9jYXRpb24gcmVmbGVjdHMgdGhlIHJlbGF0aXZlIGltcG9ydGFuY2UgeW91IGF0dGFjaCB0byBlYWNoIGF0dHJpYnV0ZS4NCg0KYGBge3IsIGVjaG89RiwgZmlnLmFsaWduPSdjZW50ZXInLG91dC53aWR0aD0nODAlJ30NCmtuaXRyOjogaW5jbHVkZV9ncmFwaGljcygnY29uc3RhbnQtc3VtLXNjYWxlLnBuZycpDQpgYGANCg0KKiBCYXNpYyBhbmFseXNpcyBvZiBjb25zdGFudC1zdW0gZGF0YSBpbnZvbHZlcyB0YWJ1bGF0aW9uIG9mIHJlc3BvbnNlcyBhbmQgcHJlc2VudGluZyB0aGVtIGFzIGVpdGhlciBxdWFudGl0aWVzIChlLmcuLCAib24gYXZlcmFnZSwgNyBwb2ludHMgd2VyZSBhbGxvY2F0ZWQgdG8gImhpZ2ggYWxjb2hvbCBsZXZlbCIpLCBvciwgYXMgcHJvcG9ydGlvbnMgKCJPbiBhdmVyYWdlLCA3JSBvZiBwb2ludHMgd2VyZSBhbGxvY2F0ZWQgdG8gImhpZ2ggYWxjb2hvbCBsZXZlbCIpLiAgDQoNCg0KIyMjIyBOb24tQ29tcGFyYXRpdmUgU2NhbGVzOiBDb250aW51b3VzIFJhdGluZyBTY2FsZXMgIA0KDQoqIFBhcnRpY2lwYW50cyByYXRlIHRoZSBvYmplY3RzIGJ5IHBsYWNpbmcgYSBtYXJrIGF0IHRoZSBhcHByb3ByaWF0ZSBwb3NpdGlvbiBvbiBhIGxpbmUgdGhhdCBydW5zIGZyb20gb25lIGV4dHJlbWUgb2YgdGhlIGNyaXRlcmlvbiB2YXJpYWJsZSB0byB0aGUgb3RoZXIuICANCiogT25lIG9mIHRoZSBhZHZhbnRhZ2VzIG9mIHRoZSBjb250aW51b3VzIHJhdGluZyBzY2FsZSBpcyB0aGF0IGl0IGlzIGVhc3kgdG8gYWRtaW5pc3Rlci4gIA0KDQpgYGB7ciwgZWNobz1GLCBmaWcuYWxpZ249J2NlbnRlcicsb3V0LndpZHRoPSc3MCUnfQ0Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoJ2NvbnRpbnVvdXMtcmF0aW5nLXNjYWxlLnBuZycpDQpgYGANCg0KKiBPbmNlIHRoZSByYXRpbmdzIGFyZSBjb2xsZWN0ZWQsIHlvdSBjYW4gc3BsaXRzIHVwIHRoZSBvYnRhaW5lZCByYXRpbmdzIGludG8gY2F0ZWdvcmllcyBhbmQgdGhlbiBhc3NpZ24gdGhvc2UgZGVwZW5kaW5nIG9uIHRoZSBjYXRlZ29yeSBpbiB3aGljaCB0aGUgcmF0aW5ncyBmYWxsLg0KDQoNCiMjIyMgTm9uLUNvbXBhcmF0aXZlIFNjYWxlczogSXRlbWl6ZWQgUmF0aW5nIFNjYWxlcyAgDQoNCiogVGhlIHJlc3BvbmRlbnRzIGFyZSBwcm92aWRlZCB3aXRoIGEgc2NhbGUgdGhhdCBoYXMgYSBudW1iZXIgb3IgYnJpZWYgZGVzY3JpcHRpb24gYXNzb2NpYXRlZCB3aXRoIGVhY2ggY2F0ZWdvcnkuICANCiogVGhlIGNhdGVnb3JpZXMgYXJlIG9yZGVyZWQgaW4gdGVybXMgb2Ygc2NhbGUgcG9zaXRpb24sIGFuZCB0aGUgcmVzcG9uZGVudHMgYXJlIHJlcXVpcmVkIHRvIHNlbGVjdCB0aGUgc3BlY2lmaWVkIGNhdGVnb3J5IHRoYXQgYmVzdCBkZXNjcmliZXMgdGhlIG9iamVjdCBiZWluZyByYXRlZC4gIA0KKiBUaGUgY29tbW9ubHkgdXNlZCBpdGVtaXplZCByYXRpbmcgc2NhbGVzIGFyZSAqKnRoZSBMaWtlcnQsIHNlbWFudGljIGRpZmZlcmVudGlhbCBhbmQgU3RhcGVsIHNjYWxlcy4qKg0KDQojIyMjIyBJdGVtaXplZCBSYXRpbmcgU2NhbGVzOiAgTGlrZXJ0IHNjYWxlDQoNCiogUmVxdWlyZXMgcmVzcG9uZGVudHMgdG8gaW5kaWNhdGUgdGhlaXIgYXR0aXR1ZGUgdG93YXJkcyB0aGUgZ2l2ZW4gb2JqZWN0IHRocm91Z2ggdGhlIGRlZ3JlZSBvZiBhZ3JlZW1lbnQgb3IgZGlzYWdyZWVtZW50IHdpdGggZWFjaCBvZiBhIHNlcmllcyBvZiBzdGF0ZW1lbnRzIHdpdGhpbiB0eXBpY2FsbHkgZml2ZSBvciBzZXZlbiBjYXRlZ29yaWVzLiAgDQoqIFJldmVyc2VkIGNvZGUgb2Ygc29tZSBpdGVtcyBpbmNyZWFzZXMgdmFsaWRpdHkuICANCiogT25lIGxpbWl0YXRpb24gaXMgdGltZSByZXF1aXJlZCB0byBhbnN3ZXIgYSBxdWVzdGlvbiBvbiBhIExpa2VydCBzY2FsZS4gQ29tcGFyZWQgdG8gb3RoZXIgaXRlbWl6ZWQgc2NhbGluZyB0ZWNobmlxdWVzLCBMaWtlcnQgc2NhbGUgaXMgbW9yZSB0aW1lIGNvbnN1bWluZyBhcyBlYWNoIHJlc3BvbmRlbnQgaXMgcmVxdWlyZWQgdG8gcmVhZCBldmVyeSBzdGF0ZW1lbnQgZ2l2ZW4gaW4gYSBxdWVzdGlvbm5haXJlIGJlZm9yZSBhc3NpZ25pbmcgYSBudW1lcmljYWwgdmFsdWUgdG8gaXQuDQoNCmBgYHtyLCBlY2hvPUYsIGZpZy5hbGlnbj0nY2VudGVyJyxvdXQud2lkdGg9JzcwJSd9DQprbml0cjo6aW5jbHVkZV9ncmFwaGljcygnbGlrZXJ0LnBuZycpDQpgYGANCg0KSW4gdGhlIHRhYmxlIGJlbG93IHlvdSBjYW4gZmluZCBhIGNvdXBsZSBvZiBjb21tb25seSBtZWFzdXJlZCBjb25zdHJ1Y3RzIGluIG1hcmtldGluZyByZXNlYXJjaCBzdWNoIGFzIGF0dGl0dWRlLCBpbXBvcnRhbmNlLCBwdXJjaGFzZSBpbnRlbnRpb24gYW5kIHNpbWlsYXIuDQoNCmBgYHtyLCBlY2hvPUYsIGZpZy5hbGlnbj0nY2VudGVyJyxvdXQud2lkdGg9JzcyJSd9DQprbml0cjo6aW5jbHVkZV9ncmFwaGljcygnbGlrZXJ0LW1hcmtldGluZy1yZXNlcmFjaC5wbmcnKQ0KYGBgDQoNCg0KIyMjIyMgSXRlbWl6ZWQgUmF0aW5nIFNjYWxlczogU2VtYW50aWMgRGlmZmVyZW50aWFsDQoNCiogVHlwaWNhbGx5LCBwYXJ0aWNpcGFudHMgcmF0ZSBvYmplY3RzIG9uIGEgbnVtYmVyIG9mIGl0ZW1pemVkLCBzZXZlbi1wb2ludCByYXRpbmcgc2NhbGVzIGJvdW5kZWQgYXQgZWFjaCBlbmQgYnkgb25lIG9mIHR3byBiaXBvbGFyIGFkamVjdGl2ZXMuICANCg0KKiBTZW1hbnRpYyBkaWZmZXJlbnRpYWwgY2FuIG1lYXN1cmUgcmVzcG9uZGVudCBhdHRpdHVkZXMgdG93YXJkcyBzb21ldGhpbmcgKHByb2R1Y3RzLGNvbmNlcHRzLCBpdGVtcywgcGVvcGxlLi4uKS4NCg0KKiBJdCBoZWxwcyB5b3UgZmluZCB0aGUgcmVwb25kZW50J3MgcG9zaXRpb24gaXMgb24gYSBzY2FsZSBiZXR3ZWVuIHR3byBiaXBvbGFyIGFkamVjdGl2ZXMgc3VjaCBhcyDigJxTd2VldC1Tb3Vy4oCdIG9yIOKAnEJyaWdodC1EYXJr4oCdLiBJbiBjb21wYXJpc29uIHRvIExpa2VydCBzY2FsZSwgd2hpY2ggdXNlcyBnZW5lcmljIHNjYWxlcyAoZS5nLiBleHRyZW1lbHkgZGlzc2F0aXNmaWVkIHRvIGV4dHJlbWVseSBzYXRpc2ZpZWQpLCBzZW1hbnRpYyBkaWZmZXJlbnRpYWwgcXVlc3Rpb25zIGFyZSBwb3NlZCB3aXRoaW4gdGhlIGNvbnRleHQgb2YgZXZhbHVhdGluZyBhdHRpdHVkZXMuDQoNCiogV2lkZWx5IHVzZWQgcmF0aW5nIHNjYWxlIGluIG1hcmtldGluZyByZXNlYXJjaCBkdWUgdG8gaXRzIHZlcnNhdGlsaXR5DQoNCmBgYHtyLCBlY2hvPUYsIGZpZy5hbGlnbj0nY2VudGVyJyxvdXQud2lkdGg9JzcyJSd9DQprbml0cjo6aW5jbHVkZV9ncmFwaGljcygnc2VtYW50aWMtZGlmZmVyZW50aWFsLnBuZycpDQpgYGANCg0KV2hlbiBjcmVhdGluZyBhIHNlbWFudGljYWwgZGlmZmVyZW5jZSBxdWVzdGlvbiwgeW91IHNob3VsZCBjb25zaWRlciB0aGUgZm9sbG93aW5nOg0KDQoqICoqTnVtYmVyIG9mIGNhdGVnb3JpZXM6KiogDQoNCmBgYHtyLCBlY2hvPUYsIGZpZy5hbGlnbj0nbGVmdCcsb3V0LndpZHRoPSc3MiUnfQ0Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoJ3NlbWFudGljLWRpZmZlcmVudGlhbC0xLnBuZycpDQpgYGANCg0KKiAqKkJhbGFuY2VkIHZzLiB1bmJhbGFuY2VkOioqDQoNCmBgYHtyLCBlY2hvPUYsIGZpZy5hbGlnbj0nbGVmdCcsb3V0LndpZHRoPSc3MiUnfQ0Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoJ3NlbWFudGljLWRpZmZlcmVudGlhbC0yLnBuZycpDQpgYGANCg0KKiAqKk9kZC9ldmVuIG51bWJlciBvZiBjYXRlZ29yaWVzOioqDQoNCmBgYHtyLCBlY2hvPUYsIGZpZy5hbGlnbj0nbGVmdCcsb3V0LndpZHRoPSc3MiUnfQ0Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoJ3NlbWFudGljLWRpZmZlcmVudGlhbC0zLnBuZycpDQpgYGANCg0KKiAqKkZvcmNlZCB2cy4gbm9uLWZvcmNlZCByZXNwb25zZSoqDQoNCmBgYHtyLCBlY2hvPUYsIGZpZy5hbGlnbj0nbGVmdCcsb3V0LndpZHRoPSc3MiUnfQ0Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoJ3NlbWFudGljLWRpZmZlcmVudGlhbC00LnBuZycpDQpgYGANCg0KKiAqKlZlcmJhbCBkZXNjcmlwdGlvbjoqKg0KDQpgYGB7ciwgZWNobz1GLCBmaWcuYWxpZ249J2xlZnQnLG91dC53aWR0aD0nNzIlJ30NCmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKCdzZW1hbnRpYy1kaWZmZXJlbnRpYWwtNS5wbmcnKQ0KYGBgDQoNCg0KDQoNCg0KIyMjIFF1ZXN0aW9ubmFpcmUgc3RydWN0dXJlDQoNClRoZSBzZXF1bmVjZSBvZiBxdWVzdGlvbnMgaW4gYSBxdWVzdGlvbm5haXJlIGNvdWxkIHBsYXkgaW1wb3JhbnQgcm9sZS4gRm9yIGluc3RhbmNlLCBtb3JlIHNlbnNpdGl2ZSBxdWVzdGlvbnMgKHN1Y2ggYXMgZGVtb2dyYXBoaWMtcmVsYXRlZCBxdWVzdGlvbnMpIGFyZSB1c3VhbGx5IHBsYWNlZCBhdCB0aGUgZW5kIGFzIHRoZXkgY2FuIHRyaWdnZXIgY2hhbmdlIGluIHJlc3BvbmRlbnQncyBiZWhhdmlvci4gDQoNCklmIHlvdSBwbGFuIHRvIGNvbmR1Y3QgYW4gb25saW5lIHN1cnZleSwgdGhlbiB5b3UgbmVlZCB0byB0aGluayBhYm91dCB0aGUgcmVzcG9uZGVudCdzIGV4cGVyaWVuY2Ugd2hpbGUgZG9pbmcgeW91ciBxdWVzdGlvbm5haXJlLiBGb3IgaW5zdGFuY2UsIHNwcmVhZCB0aGUgY29udGVudCBvdmVyIG1vcmUgc2hvcnQgcGFnZXMgYW5kIGRvIG5vdCBoYXZlIGZld2VyIGxvbmcgcGFnZXMuIEluIG9ubGluZSBzdXJ2ZXlzLCB0d28gcXVlc3Rpb25zIG9uIG9uZSBwYWdlIGlzIGEgdXNlZnVsIHJ1bGUgb2YgdGh1bWIuIEdlbmVyYWxseSwgcmVzcG9uZGVudHMgYXJlIHJlbHVjdGFudCB0byByZWFkIGFuZCBmaWxsIG91dCBsb25nIHF1ZXN0aW9ubmFpcmUgcGFnZXMuIEhlbmNlLCBsb25nIHBhZ2VzIHdpbGwgbGVhZCB0byBhIGhpZ2hlciBkcm9wb3V0IHJhdGUuDQpJbiBvcmRlciB0byByZWR1Y2UgZHJvcG91dCByYXRlIHN0YXRlIGhvdyBsb25nIHRoZSBzdXJ2ZXkgd2lsbCBhcHByb3hpbWF0ZWx5IHRha2UgaW4gdGhlIGludHJvZHVjdGlvbiBvZiB0aGUgcXVlc3Rpb25uYWlyZS4gVGFrZSBpbnRvIGFjY291bnQgdGhhdCB0b29scyBsaWtlIFF1YWx0cmljcyBwcm92aWRlIHRoZSBlc3RpbWF0ZWQgcmVzcG9uc2UgdGltZSBpbiB0aGUgc3VydmV5IG92ZXJ2aWV3Lg0KDQpDb25zaWRlciB0aGF0IHRoZSBtb3N0IG9mIHBlb3BsZSB1c3VhbGx5IHVzZSB0aGVpciBwaG9uZXMgdG8gZmlsbCBpdCBvdXQuIFRoaW5rIGFib3V0IGhvdyB0aGUgcXVlc3Rpb25uYWlyZSB3aWxsIGFwcGVhciBvbiBhIHBob25lIHNjcmVlbiB0b28uIEluIHRoYXQgcmVnYXJkLCB0aGluayBvZiBsZW5ndGggb2YgcXVlc3Rpb25zIGVzcGVjaWFsbHkuDQoNCkluIHRoZSBlbmQsIHRoZSBxdWVzdGlvbm5haXJlIHN0cnVjdHVyZSBoYXMgdG8gYmUgYWxpZ25lZCB3aXRoIHRoZSByZXNlYXJjaCBkZXNpZ24uIEZvciBleGFtcGxlLCBpZiB5b3VyIHJlc2VhcmNoIGRlc2lnbiBmZWF0dXJlcyBhbiBleHBlcmltZW50LCB0aGlzIG5lZWRzIHRvIGJlIHJlZmxlY3RlZCBpbiB0aGUgcXVlc3Rpb25uYWlyZSAoZS5nLiwgeW91IG5lZWQgdG8gYXNzaWduIHRoZSByZXNwb25kZW50cyByYW5kb21seSB0byB0aGUgZXhwZXJpbWVudGFsIGNvbmRpdGlvbnMgaW4gY2FzZSBvZiBhIGJldHdlZW4tc3ViamVjdHMgY29tcGFyaXNvbikuDQoNCiMjIyMgUXVlc3Rpb25uYWlyZSBzdHJ1Y3R1cmUgZm9yIGEgYmV0d2Vlbi1zdWJqZWN0cyBkZXNpZ24NCg0KSW4gYSBiZXR3ZWVuLXN1YmplY3QgZGVzaWduIHlvdSByYW5kb21seSBhc3NpZ24gZWFjaCByZXNwb25kZW50IHRvIGRpZmZlcmVudCBleHBlcmltZW50YWwgY29uZGl0aW9ucy4gVGhleSB3b3VsZCB0aGVuIGNvbXBsZXRlIHRhc2tzIG9ubHkgaW4gdGhlIGNvbmRpdGlvbiB0byB3aGljaCB0aGV5IGFyZSBhc3NpZ25lZC4NCg0KRm9yIGluc3RhbmNlLCB3ZSB3b3VsZCBsaWtlIHRvIHRlc3QgdGhlIGVmZmVjdCBvZiB0d28gYWR2ZXJ0aXNlbWVudHMgb24gcHVyY2hhc2UgaW50ZW50aW9uLiBUaGVyZWZvcmUsIG9uZSBncm91cCBvZiAocmFuZG9tbHkgYXNzaWduZWQpIHJlc3BvbmRlbnRzIHdpbGwgYmUgZXhwb3NlZCB0byBvbmUgYWR2ZXJ0aXNlbWVudCB2ZXJzaW9uIHdoaWxlIHRoZSBvdGhlciBncm91cCAob2YgcmFuZG9tbHkgYXNzaWduZWQgcmVzcG9uZGVudHMpIHdpbGwgYmUgZXhwb3NlZCB0byBhbm90aGVyIHZlcnNpb24uIEFmdGVyIHRoYXQsIGJvdGggZ3JvdXBzIG9mIHJlc3BvbmRlbnRzIHNob3VsZCBleHByZXNzIHRoZWlyIHdpbGxpbmduZXNzIHRvIGJ1eSB0aGUgYWR2ZXJ0aXNlZCBwcm9kdWN0LiBFdmVudXRhbGx5LCBpZiB0aGUgZGVwZW5kZW50IHZhcmlhYmxlIChlLmcuIHdpbGxpbmduZXNzIHRvIGJ1eSkgaXMgbWVhc3VyZWQgb24gaW50ZXJ2YWwgb3IgcmF0aW8gc2NhbGUsIHRoZW4geW91IGNhbiB1c2UgaW5kZXBlbmRlbnQgdC10ZXN0IHRvIGNvbXBhcmUgZ3JvdXAgbWVhbnMuIFRoZSB3aG9sZSBleHBlcmltZW50YWwgZGVzaWduIHNob3VsZCBiZSBvcmdhbmlzZWQgYXMgZm9sbG93aW5nOg0KDQpgYGB7ciwgZWNobz1GLCBmaWcuYWxpZ249J2NlbnRlcicsb3V0LndpZHRoPSc3MiUnfQ0Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoJ2JldHdlZW4tc3ViamVjdC1kZXNpZ24ucG5nJykNCmBgYA0KDQoNCiMjIyMgUXVlc3Rpb25uYWlyZSBzdHJ1Y3R1cmUgZm9yIGEgd2l0aGluLXN1YmplY3RzIGRlc2lnbg0KDQpUaGlzIHR5cGUgb2YgZXhwZXJpbWVudGFsIGRlc2lnbiBpbnZvbHZlcyBleHBvc2luZyBlYWNoIHJlc3BvbmRlbnQgdG8gYWxsIG9mIHRoZSB1c2VyIGV4cGVyaW1lbnRhbCBjb25kaXRpb25zIHlvdeKAmXJlIHRlc3RpbmcuIFRoaXMgd2F5LCBlYWNoIHJlc3BvbmRlbnQgd2lsbCB0ZXN0IGFsbCBvZiB0aGUgY29uZGl0aW9ucy4NCg0KRm9yIGluc3RhbmNlLCB3ZSB3b3VsZCBsaWtlIHRvIHRlc3QgYWdhaW4gdGhlIGVmZmVjdCBvZiB0d28gYWR2ZXJ0aXNlbWVudHMgb24gcHVyY2hhc2UgaW50ZW50aW9ucywgYnV0IHRoaXMgdGltZSBpbiBhIHdpdGhpbi1zdWJqZWN0IGRlc2lnbi4gRmlyc3QsIGVhY2ggcmVzcG9uZGVudCB3aWxsIGJlIGV4cG9zZWQgdG8gdGhlIGZpcnN0IHZlcnNpb24gb2YgYWR2ZXJ0aXNlbWVudCBhbmQgcmlnaHQgYWZ0ZXIgdGhhdCBhc2tlZCB0byByYXRlIGhpcy9oZXIgd2lsbGluZ25lc3MgdG8gYnV5IHRoZSBhZHZlcnRpc2VkIHByb2R1Y3QuIFN1YnNlcXVlbnRseSwgZWFjaCBwYXJ0aWNpcGFudCB3aWxsIGJlIHNob3duIGFub3RoZXIgdmVyc2lvbiBvZiBhZHZlcnRpc2VtZW50IGFuZCBhZ2FpbiByYXRlIGhpcy9oZXIgd2lsbGluZ25lc3MgdG8gcHVyY2hhc2UgdGhlIGFkdmVydGlzZWQgcHJvZHVjdC4gRmluYWxseSwgd2UgY2FuIGNvbXBhcmUgZ3JvdXAgbWVhbnMgd2l0aCBwYWlyZWQgc2FtcGxlIHQtdGVzdCAoZ2l2ZW4gdGhhdCBkYXRhIGlzIG1lYXN1cmVkIG9uIGludGVydmFsIG9yIHJhdGlvIHNjYWxlKS4gDQoNCmBgYHtyLCBlY2hvPUYsIGZpZy5hbGlnbj0nY2VudGVyJyxvdXQud2lkdGg9JzcyJSd9DQprbml0cjo6aW5jbHVkZV9ncmFwaGljcygnd2l0aGluLXN1YmplY3QtZGVzaWduLnBuZycpDQpgYGANCg0KDQojIyMgUXVlc3Rpb24gd29yZGluZw0KDQpHZW5lcmFsbHksIHF1ZXN0aW9uIHdvcmRpbmcgc2hvdWxkIGVuYWJsZSBlYWNoIHJlc3BvbmRlbnQgdG8gdW5kZXJzdGFuZCAgcXVlc3Rpb25zIGFuZCB0byBiZSBhYmxlIHRvIGFuc3dlciB0aGVtIHdpdGggcmVsaWFiaWxpdHkuIFJlbGlhYmlsaXR5IG1lYW5zIHRoYXQsIGlmIGEgcmVzcG9uZGVudCB3YXMgYXNrZWQgdGhlIHNhbWUgcXVlc3Rpb24gYWdhaW4sIGhlL3NoZSB3b3VsZCBnaXZlIHRoZSBzYW1lIGFuc3dlciBhZ2Fpbi4gQSBudW1iZXIgb2YgY29tbW9uIHByb2JsZW1zIHJlZ2FyZGluZyB0aGUgcXVlc3Rpb24gd29yZGluZyBoYXZlIGJlZW4gaWRlbnRpZmllZCwgc28gd2Ugd2lsbCBhZGRyZXNzIHRoZSBtb3N0IGltcG9ydGFudCBvbmVzLiANCg0KSW4gb3JkZXIgdG8gZW5zdXJlIHJlbGlhYmlsaXR5LCB0aGUgaXNzdWUgaW4gdGVybXMgb2YgKip3aG8sIHdoYXQsIHdoZW4gYW5kIHdoZXJlKiogc2hvdWxkIGJlIGRlZmluZWQgaW4gZWFjaCBxdWVzdGlvbi4gIA0KKkV4YW1wbGU6KiBXaGljaCBicmFuZCBvZiBzaGFtcG9vIGRvIHlvdSB1c2U/ICANCioqV2hvICh0aGUgcmVzcG9uZGVudCk6KiogSXQgaXMgbm90IGNsZWFyIHdoZXRoZXIgdGhpcyBxdWVzdGlvbiByZWxhdGVzIHRvIHRoZSBpbmRpdmlkdWFsIHJlc3BvbmRlbnQgb3IgdGhlIHJlc3BvbmRlbnTigJlzIHRvdGFsIGhvdXNlaG9sZC4gIA0KKipXaGF0ICh0aGUgYnJhbmQgb2Ygc2hhbXBvbyk6KiogSXQgaXMgdW5jbGVhciBob3cgdGhlIHJlc3BvbmRlbnQgaXMgdG8gYW5zd2VyIHRoaXMgcXVlc3Rpb24gaWYgbW9yZSB0aGFuIG9uZSBicmFuZCBpcyB1c2VkLiAgDQoqKldoZW4gKHVuY2xlYXIpOioqIFRoZSB0aW1lIGZyYW1lIGlzIG5vdCBzcGVjaWZpZWQgaW4gdGhpcyBxdWVzdGlvbi4gVGhlIHJlc3BvbmRlbnQgY291bGQgaW50ZXJwcmV0IGl0IGFzIG1lYW5pbmcgdGhlIHNoYW1wb28gdXNlZCB0aGlzIG1vcm5pbmcsIHRoaXMgd2Vlaywgb3Igb3ZlciB0aGUgcGFzdCB5ZWFyLiAgDQoqKldoZXJlIChub3Qgc3BlY2lmaWVkKToqKiBBdCBob21lLCBhdCB0aGUgZ3ltPyBXaGVyZT8NCg0KKkEgbW9yZSBjbGVhcmx5IGRlZmluZWQgcXVlc3Rpb24gaXM6KiAgDQpXaGljaCBicmFuZCBvciBicmFuZHMgb2Ygc2hhbXBvbyBoYXZlIHlvdSBwZXJzb25hbGx5IHVzZWQgYXQgaG9tZSBkdXJpbmcgdGhlIGxhc3QgbW9udGg/IEluIHRoZSBjYXNlIG9mIG1vcmUgdGhhbiBvbmUgYnJhbmQsIHBsZWFzZSBsaXN0IGFsbCB0aGUgYnJhbmRzIHRoYXQgYXBwbHkuDQoNCioqVXNlIG9yZGluYXJ5IHdvcmRzLioqIFdvcmRzIHNob3VsZCBtYXRjaCB0aGUgdm9jYWJ1bGFyeSBsZXZlbCBvZiB0aGUgcGFydGljaXBhbnRzLiAgDQo8c3BhbiBzdHlsZT0iY29sb3I6IHJlZDsiPjxCPkluY29ycmVjdDo8L0I+PC9zcGFuPiAgICANCuKAnERvIHlvdSB0aGluayB0aGUgZGlzdHJpYnV0aW9uIG9mIHNvZnQgZHJpbmtzIGlzIGFkZXF1YXRlP+KAnSAgIA0KPHNwYW4gc3R5bGU9ImNvbG9yOiBncmVlbjsiPjxCPkNvcnJlY3Q6PC9CPjwvc3Bhbj4gIA0K4oCcRG8geW91IHRoaW5rIHNvZnQgZHJpbmtzIGFyZSBlYXNpbHkgYXZhaWxhYmxlIHdoZW4geW91IHdhbnQgdG8gYnV5IHRoZW0/4oCdDQoNCioqQXZvaWQgZG91YmxlIG5lZ2F0aXZlIGZvcm0qKi4gRG91YmxlIG5lZ2F0aXZlIHF1ZXN0aW9uIGZvcm1zIGNhbiBjb25mdXNlIHJlc3BvbmRlbnRzLCBlc3BlY2lhbGx5IHdoZW4gdGhleSBuZWVkIHRvIGFuc3dlciB3aXRoIOKAnEFncmVl4oCdIG9yIOKAnERpc2FncmVl4oCdLg0KDQo8c3BhbiBzdHlsZT0iY29sb3I6IHJlZDsiPjxCPkluY29ycmVjdDo8L0I+PC9zcGFuPiAgICAgIA0KRG8geW91IHRoaW5rIHRoYXQgaXQgaXMgbm90IHVuY29tbW9uIHRoYXQgYm95cyBwbGF5IGJhc2tldGJhbGw/ICANCjxzcGFuIHN0eWxlPSJjb2xvcjogZ3JlZW47Ij48Qj5Db3JyZWN0OjwvQj48L3NwYW4+ICANCkluIHlvdXIgb3BpbmlvbiwgaXMgaXQgY29tbW9uIHRoYXQgYm95cyBwbGF5IGJhc2tldGJhbGw/DQoNCg0KDQoqKkF2b2lkIGxlYWRpbmcgcXVlc3Rpb25zLioqTGVhZGluZyBxdWVzdGlvbnMgY2x1ZSB0aGUgcGFydGljaXBhbnQgdG8gd2hhdCB0aGUgYW5zd2VyIHNob3VsZCBiZS4gU3VjaCBxdWVzdGlvbnMgaW50cm9kdWNlIGEgYmlhcyBpbiBhIHBhcnRpY3VsYXIgZGlyZWN0aW9uLiAgDQo8c3BhbiBzdHlsZT0iY29sb3I6IHJlZDsiPjxCPkluY29ycmVjdDo8L0I+PC9zcGFuPiAgICANCuKAnElzIENvbGdhdGUgeW91ciBmYXZvcml0ZSB0b290aHBhc3RlP+KAnSAgDQo8c3BhbiBzdHlsZT0iY29sb3I6IGdyZWVuOyI+PEI+Q29ycmVjdDo8L0I+PC9zcGFuPiAgICAgICANCuKAnFdoYXQgaXMgeW91ciBmYXZvcml0ZSBicmFuZCBvZiB0b290aHBhc3RlP+KAnQ0KDQoqKkF2b2lkIGFtYmlndW91cyB3b3Jkcy4qKiBXb3JkcyBzdWNoIGFzIHVzdWFsbHksIG5vcm1hbGx5LCBmcmVxdWVudGx5LCBvZnRlbiwgcmVndWxhcmx5LCBhbmQgb3RoZXIgc2ltaWxhciB3b3JkcywgZG8gbm90IGRlZmluZSBmcmVxdWVuY3kgY2xlYXJseSBlbm91Z2guDQoNCjxzcGFuIHN0eWxlPSJjb2xvcjogcmVkOyI+PEI+SW5jb3JyZWN0OjwvQj48L3NwYW4+ICAgICAgDQrigJxJbiBhIHR5cGljYWxseSBtb250aCwgaG93IG9mdGVuIGRvIHlvdSBnbyB0byBhIG1vdmllIHRoZWF0ZXIgdG8gc2VlIGEgbW92aWU/4oCdICANCmEpIE5ldmVyICANCmIpIE9jY2FzaW9uYWxseSAgDQpjKSBTb21ldGltZXMgICANCmQpIE9mdGVuICAgDQplKSBSZWd1bGFybHkgIA0KDQo8c3BhbiBzdHlsZT0iY29sb3I6IGdyZWVuOyI+PEI+Q29ycmVjdDo8L0I+PC9zcGFuPiAgICAgDQoiSW4gYSB0eXBpY2FsbHkgbW9udGgsIGhvdyBvZnRlbiBkbyB5b3UgZ28gdG8gYSBtb3ZpZSB0aGVhdGVyIHRvIHNlZSBhIG1vdmllPyIgICAgDQphKSBMZXNzIHRoYW4gb25jZSAgDQpiKSAxIG9yIDIgdGltZXMgIA0KYykgMyBvciA0IHRpbWVzICANCmQpIE1vcmUgdGhhbiA0IHRpbWVzDQoNCiMjIyBDaG9vc2UgYWRlcXVhdGUgb3JkZXINCg0KT25lIG9mIHRoZSBsYXN0IHN0ZXBzIGluIGEgcHJvY2VzcyBvZiBkZXNpZ25pbmcgYSBxdWVzdGlvbm5haXJlIGlzIGNob29zaW5nIGFkZXF1YXRlIG9yZGVyIG9mIHF1ZXN0aW9ucyBhbmQgaW5zdHJ1Y3Rpb25zIGZvciByZXNwb25kZW50cy4gDQoNCkF0IHRoZSBiZWdpbmluZywgeW91IHNob3VsZCBwcm92aWRlIGEgc2hvcnQgYW5kIGVhc3ktdG8tdW5kZXJzdGFuZCBpbnRyb2R1Y3Rpb24gdG8gdGhlIHRvcGljLiBVc2Ugc2ltcGxlIGxhbmd1YWdlIGFuZCBhdm9pZCB0ZWNobmljYWwgdGVybXMgKGUuZy4sIG5vdCBtYW55IHBlb3BsZSB3aWxsIGtub3cgdGhlIHRlcm1zIOKAnG1hbnVmYWN0dXJlciBicmFuZOKAnSBhbmQg4oCcc3RvcmUgYnJhbmTigJ0pLiBBZGRpdGlvbmFsbHksIGluIHRoZSBpbnRyb2R1Y3Rpb24geW91IHNob3VsZCBzdGF0ZSBob3cgbG9uZyB0aGUgc3VydmV5IHdpbGwgYXBwcm94aW1hdGVseSB0YWtlLg0KDQpUaGUgb3BlbmluZyBxdWVzdGlvbnMgc2hvdWxkIGJlIGludGVyZXN0aW5nLCBzaW1wbGUgYW5kIG5vbi10aHJlYXRlbmluZy4NClRoZXkgYXJlIGNydWNpYWwgYmVjYXVzZSBpdCBpcyB0aGUgcmVzcG9uZGVudCdzIGZpcnN0IGV4cG9zdXJlIHRvIHRoZSBxdWVzdGlvbm5haXJlIGFuZCBpcyBsaWtlbHkgdG8gc2V0IHRoZSB0b25lIGZvciB0aGUgcmVzdCBvZiBxdWVzdGlvbnMgaW4gdGhlIHF1ZXN0aW9ubmFpcmUuIElmIHRvbyBkaWZmaWN1bHQgdG8gdW5kZXJzdGFuZCwgb3Igc2Vuc2l0aXZlIGluIHNvbWUgd2F5LCByZXNwb25kZW50cyBhcmUgbGlrZWx5IHRvIHN0b3AgYW5zd2VyaW5nIHlvdXIgcXVlc3Rpb25zLiBRdWFsaWZ5aW5nIHF1ZXN0aW9ucyAob3Igc2NyZWVuaW5nIHF1ZXN0aW9ucykgc2hvdWxkIHNlcnZlIGFzIHRoZSBvcGVuaW5nIHF1ZXN0aW9ucyAoaWYgYXBwbGljYWJsZSkuIFRoZWlyIHB1cnBvc2UgaXMgdG8gaWRlbnRpZnkgYSBwb3RlbnRpYWwgcmVzcG9uZGVudCB0aGF0IGlzIGVsaWdhYmxlIHRvIHByb2NlZWQgd2l0aCB0aGUgcmVzZWFyY2ggc3VydmV5Lg0KDQpBZnRlciB0aGUgb3BlbmluZyBwYXJ0LCB5b3Ugc2hvdWxkIGVzdGFibGlzaCBhbiBvcHRpbWFsIHF1ZXN0aW9uIGZsb3cuDQpHZW5lcmFsIHF1ZXN0aW9ucyBzaG91bGQgcHJlY2VkZSB0aGUgc3BlY2lmaWMgcXVlc3Rpb25zLiBRdWVzdGlvbnMgb24gb25lIHN1YmplY3QsIG9yIG9uZSBwYXJ0aWN1bGFyIGFzcGVjdCBvZiBhIHN1YmplY3QsIHNob3VsZCBiZSBncm91cGVkIHRvZ2V0aGVyLiBJdCBtYXkgZmVlbCBjb25mdXNpbmcgdG8gYmUgYXNrZWQgdG8gcmV0dXJuIHRvIHNvbWUgc3ViamVjdCB0aGV5IHRob3VnaHQgdGhleSBhbHJlYWR5IGdhdmUgdGhlaXIgb3BpbmlvbnMgYWJvdXQuDQoNCkFzIHJlc3BvbmRlbnRzIGFyZSBtb3ZpbmcgdG93YXJkcyB0aGUgZW5kIG9mIHRoZSBxdWVzdGlvbm5haXJlLCB0aGV5IGFyZSBsaWtlbHkgdG8gYmVjb21lIGluY3JlYXNpbmdseSBpbmRpZmZlcmVudCBhbmQgbWlnaHQgZ2l2ZSBjYXJlbGVzcyBhbnN3ZXJzLiBUaGVyZWZvcmUsIHF1ZXN0aW9ucyBvZiBzcGVjaWFsIGltcG9ydGFuY2Ugc2hvdWxkIGlkZWFsbHkgYmUgaW5jbHVkZWQgaW4gdGhlIGVhcmxpZXIgcGFydCBvZiB0aGUgcXVlc3Rpb25uYWlyZS4gDQoNCkZpbmFsbHksIHlvdSBzaG91bGQgcGF5IHBhcnRpY3VsYXIgYXR0ZW50aW9uIHRvIHByb3ZpZGUgYWxsIHByZXNjcmliZWQgZGVmaW5pdGlvbnMgYW5kIGV4cGxhbmF0aW9ucyBiZWZvcmUgeW91IGFzayBhIHF1ZXN0aW9uLiBUaGlzIGVuc3VyZXMgdGhhdCB0aGUgcXVlc3Rpb25zIGFyZSB1bmRlc3Rvb2QgaW4gY29uc2lzdGVudCB3YXkgYnkgZXZlcnkgcmVzcG9uZGVudC4NCg0KIyMjIFRlc3QgeW91ciBxdWVzdGlvbm5haXJlDQoNCkZpbmFsbHksIGJlZm9yZSB5b3UgZGlzdHJpYnV0ZSB0aGUgZmluYWwgcXVlc3Rpb25uYWlyZSwgdGhlcmUgYXJlIHNvbWUgdGhpbmdzIHRvIGNvbnNpZGVyLiBGaXJzdCwgeW91IHNob3VsZCBhbHdheXMgcHJldGVzdCB5b3VyIHF1ZXN0aW9ubmFpcmUgYmVmb3JlIHNoYXJpbmcgaXQhDQpUZXN0IGFsbCBhc3BlY3RzIG9mIHRoZSBxdWVzdGlvbm5haXJlIChjb250ZW50LCB3b3JkaW5nLCBzZXF1ZW5jZSwgZm9ybSAmIGxheW91dCwgZXRjLikuIElmIHBvc3NpYmxlLCB1c2UgcmVzcG9uZGVudHMgaW4gdGhlIHByZXRlc3QgdGhhdCBhcmUgc2ltaWxhciB0byB0aG9zZSB3aG8gd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgYWN0dWFsIHN1cnZleS4gSWRlYWxseSwgdGhlIHByZXRlc3Qgc2FtcGxlIHNpemUgc2hvdWxkIGJlIHNtYWxsIChpbiBhIHJlYWwgc2NlbmFyaW8gdGhpcyBjb3VsZCB2YXJ5ZnJvbSAxNSB0byAzMCByZXNwb25kZW50czsgZm9yIHRoZSBncm91cCBwcm9qZWN0LCBhIGxvd2VyIG51bWJlciB3aWxsIGJlIHN1ZmZpY2llbnQpLiBBZnRlciBlYWNoIHNpZ25pZmljYW50IHJldmlzaW9uIG9mIHRoZSBxdWVzdGlvbm5haXJlLCBjb25kdWN0IGFub3RoZXIgcHJldGVzdCwgdXNpbmcgYSBkaWZmZXJlbnQgc2FtcGxlIG9mIHJlc3BvbmRlbnRzLiBFdmVudHVhbGx5LCBjb2RlIGFuZCBhbmFseXplIHRoZSByZXNwb25zZXMgb2J0YWluZWQgZnJvbSB0aGUgcHJldGVzdCBzbyB0aGF0IHlvdSBtYWtlIHN1cmUgdGhhdCB5b3UgY29sbGVjdGVkIGluZm9ybWF0aW9uIHlvdSBpbnRlbmRlZCB0byBjb2xsZWN0Lg0KDQpBZnRlciB0ZXN0aW5nIHlvdXIgcXVlc3Rpb25uYWlyZSB5b3Ugc2hvdWxkIGJlIGFibGUgdG8gZGV0ZXJtaW5lIHdoZXRoZXI6DQoNCiogVGhlIHF1ZXN0aW9ucyBhcmUgcHJvcGVybHkgZnJhbWVkICANCiogVGhlIHF1ZXN0aW9ucyB3b3JkaW5nIHRyaWdnZXJzIGFueSBiaWFzZXMgIA0KKiBUaGUgcXVlc3Rpb25zIGFyZSBwbGFjZWQgaW4gdGhlIG9wdGltYWwgb3JkZXIgIA0KKiBUaGUgcXVlc3Rpb25zIGFyZSB1bmRlcnN0YW5kYWJsZSAgDQoqIFNwZWNpZnlpbmcgcXVlc3Rpb25zIGFyZSBuZWVkZWQgb3Igc29tZSBuZWVkIHRvIGJlIGVsaW1pbmF0ZWQgIA0KDQoNCiMjIFF1ZXN0aW9ubmFpcmUgaW4gUXVhbHRyaWNzDQoNCkEgcXVlc3Rpb25uYWlyZSBjcmVhdGlvbiBpbiBRdWFsdHJpY3Mgc3RhcnRzIHdpdGggY3JlYXRpb24gb2YgYSBRdWxhdHJpY3MgcHJvamVjdC4gRWFjaCBwcm9qZWN0IGNvbnNpc3RzIG9mIGEgc3VydmV5LCBkaXN0cmlidXRpb24gcmVjb3JkLCBhbmQgY29sbGVjdGlvbiBvZiByZXNwb25zZXMgYW5kIHJlcG9ydHMuIFRoZXJlIGFyZSB0aHJlZSB3YXlzIHRvIGNyZWF0ZSBhIHF1ZXN0aW9ubmFpcmUuRmlyc3QsIHlvdSBjYW4gY3JlYXRlIGEgbmV3IHN1cnZleSBwcm9qZWN0IGZyb20gc2NyYXRjaC4gU2Vjb25kLCB5b3UgY2FuIGNyZWF0ZSBhIG5ldyBxdWVzdGlvbm5haXJlIGZyb20gYSBjb3B5IG9mIGFuIGV4aXN0aW5nIHF1ZXN0aW9ubmFpcmUuIEV2ZW50dWFsbHksIHlvdSBjYW4gY3JlYXRlIGZyb20gYSB0ZW1wbGF0ZSBpbiB5b3VyIFN1cnZleSBMaWJyYXJ5LCBvciBmcm9tIGFuIGV4cG9ydGVkIFFTRiBmaWxlLg0KDQoNCkluIG9yZGVyIHRvIGNyZWF0ZSBhIGNvbXBsZXRlbHkgbmV3IHF1ZXN0aW9ubmFpcmUsIHlvdSBuZWVkIHRvIGRvIHRoZSBmb2xsb3dpbmc6ICANCg0KR28gdG8gdGhlIFByb2plY3RzIHBhZ2UgYnkgY2xpY2tpbmcgdGhlIFF1YWx0cmljIFhNIGxvZ28gb3IgY2xpY2tpbmcgUHJvamVjdHMgb24gdGhlIHRvcC1yaWdodC4gIA0KDQpgYGB7ciwgZWNobz1GLCBmaWcuYWxpZ249J2NlbnRlcicsb3V0LndpZHRoPSc3MiUnfQ0Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoJ2NyZWF0ZS1uZXctcHJvamVjdC5wbmcnKQ0KYGBgDQoNCkNyZWF0ZSBuZXcgcHJvamVjdCBieSBjbGlja2luZyB0aGUgYmx1ZSBidXR0b24gb24gdGhlIHJpZ2h0IHNpZGUuICANCkluIHRoZSAiQ3JlYXRlIHlvdXIgb3duIiBzZWN0aW9uIGNsaWNrIG9uIHRoZSBzdXJ2ZXkgYnV0dG9uLg0KDQpgYGB7ciwgZWNobz1GLCBmaWcuYWxpZ249J2NlbnRlcicsb3V0LndpZHRoPSc3MiUnfQ0Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoJ2NyZWF0ZS1uZXctcHJvamVjdC0yLnBuZycpDQpgYGANCg0KRW50ZXIgYSBuYW1lIGZvciB5b3VyIHN1cnZleSBhbmQgZ2V0IHN0YXJ0ZWQgd2l0aCBhIHN1cnZleSBjcmVhdGlvbi4NCg0KYGBge3IsIGVjaG89RiwgZmlnLmFsaWduPSdjZW50ZXInLG91dC53aWR0aD0nNzIlJ30NCmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKCduZXctc3VydmV5LnBuZycpDQpgYGANCg0KSWYgeW91IHdvdWxkIGxpa2UgdG8gY3JlYXRlIGEgbmV3IHF1ZXN0aW9ubmFpcmUgb24gYSBiYXNpcyBvZiBhbiBhbHJlYWR5IGV4aXN0aW5nIG9uZSwgdGhlbiB5b3UgY2hvb3NlICJGcm9tIGEgQ29weSIuIFN1YnNlcWV1bnRseSwgeW91IG5lZWQgdG8gaW5kaWNhdGUgdGhlIHF1ZXN0aW9ubmFpcmUgeW91IHdvdWxkIGxpa2UgdG8gY29weS4gTm93IHlvdSBhcmUgZ29vZCB0byBnbyEgDQoNCmBgYHtyLCBlY2hvPUYsIGZpZy5hbGlnbj0nY2VudGVyJyxvdXQud2lkdGg9JzcyJSd9DQprbml0cjo6aW5jbHVkZV9ncmFwaGljcygnc3VydmV5LWNvcHkucG5nJykNCmBgYA0KDQpJZiB0aGVyZSBpcyBhIHF1ZXN0aW9ubmFpcmUgaW4gdGhlIFF1YWx0cmljcyBMaWJyYXJ5IHlvdSB3b3VsZCBsaWtlIHRvIHVzZSwgdGhlbiB5b3UgbmVlZCB0byBjaG9vc2UgIkZyb20gTGlicmFyeSIsIGFuZCBpbmRpY2F0ZSBvbmUgbGlicmFyeSBuYW1lIGluIHRoZSBkcm9wZG93biBtZW51LiANCg0KYGBge3IsIGVjaG89RiwgZmlnLmFsaWduPSdjZW50ZXInLG91dC53aWR0aD0nNzIlJ30NCmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKCdsaWJyYXJ5LXN1cnZleS5wbmcnKQ0KYGBgDQoNCg0KIyMgUXVlc3Rpb24gVHlwZXMgYW5kIERhdGEgQW5hbHlzaXMNCmBgYHtyLCBlY2hvID0gRkFMU0UsIHJlc3VsdHM9J2FzaXMnfQ0KcXVhbHRyaWNzIDwtIHJlYWQuY3N2KCdNUkRBIFN1cHBvcnQgVG9vbCAtIE1haW4gb3V0cHV0LmNzdicsc3RyaW5nc0FzRmFjdG9ycyA9IEYpDQpgYGANCg0KDQpJbiB0aGlzIGNoYXB0ZXIgd2Ugd2lsbCBlbmNvdW50ZXIgdGhlIG5hdHVyZSBvZiBkYXRhIHlvdSBjb2xsZWN0IHdoZW4gY29uZHVjdGluZyBhIHN1cnZleS4gSXQgd2lsbCBoZWxwIHlvdSBjaG9vc2UgYSB0eXBlIG9mIGEgcXVlc3Rpb24gZGVwZW5kaW5nIG9uIHRoZSBuYXR1cmUgb2YgZGF0YSB5b3Ugd2FudCB0byBjb2xsZWN0IGFuZCBvbiB0aGUgdHlwZSBvZiBzdGF0aXN0aWNhbCB0ZXN0cyB5b3Ugd2FudCB0byBhcHBseS4NCg0KIyMjIE11bHRpcGxlIGNob2ljZSB3aXRoIGEgc2luZ2xlIGFuc3dlcg0KDQpNdWx0aXBsZSBDaG9pY2Ugd2l0aCBhIHNpbmdsZSBhbnN3ZXIgaXMgYSB0eXBlIG9mIGNsb3NlZC1lbmRlZCBxdWVzdGlvbiB0aGF0IGxldHMgcmVzcG9uZGVudHMgc2VsZWN0ICoqb25lIGFuc3dlcioqIGZyb20gYSBkZWZpbmVkIGxpc3Qgb2YgY2hvaWNlcy4NCg0KYGBge3IsIGVjaG89RiwgZmlnLmFsaWduPSdjZW50ZXInLG91dC53aWR0aD0nNzIlJ30NCmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKCdzdXBwb3J0LW11bHRpcGxlLWNob2ljZS1xdWVzdGlvbi5wbmcnKQ0KYGBgDQoNClR5cGUgb2YgZGF0YSB5b3Ugb2J0YWluIGlzICoqY2F0ZWdvcmljYWwqKiwgYW5kIHRoZSBvdXRwdXQgY29tZXMgaW4gdGhlIGZvbGxvd2luZyBmb3JtOiAgDQpgYGB7ciwgZWNobz1GQUxTRX0NCmtuaXRyOjprYWJsZShxdWFsdHJpY3NbMTo2LGMoIlE1XzEiLCJRNV8yIiwiUTVfMyIsIlE1XzQiLCJRNV80X1RFWFQiKV0sIGNhcHRpb24gPSAiTXVsdGlwbGUgQ2hvaWNlIFF1ZXN0aW9uIHdpdGggU2luZ2xlIEFuc3dlciIpDQpgYGANCg0KIyMjIyBEYXRhIGhhbmRsaW5nDQoNCldoYXQgdG8gZG8gd2l0aCB0aGlzIGRhdGEgbm93PyBGaXJzdCwgd2UgbmVlZCB0byBsb2FkIGl0IGluIFIgYW5kIHByZXBhcmUgZm9yIGFuYWx5c2lzLiBUaGUgbnVtYmVycyB5b3Ugc2VlIGluIHRoZSBvdXRwdXQgUiByZWNvZ25pemVzICoqYXMgaW50ZWdlcnMqKi4gSW4gb3JkZXIgdG8gY29uZHVjdCBzdGF0aXN0aWNhbCBtb2RlbGxpbmcgYW5kIHByb3Blcmx5IHZpc3VhbGl6ZSBvdXIgcmVzdWx0cywgd2UgbmVlZCB0byBjb252ZXJ0IG91ciBkYXRhIHRvICoqYSBmYWN0b3IgY2xhc3MuKiogICANCkEgZmFjdG9yIChvciBjb2RpbmcgdmFyaWFibGUpIHJlcHJlc2VudHMgZGlmZmVyZW50IGdyb3VwcyBvZiBkYXRhIGJ5IHVzaW5nIG51bWJlcnMgKGludGVnZXJzKS4gSW4gZmFjdCwgZmFjdG9ycyBhcHBlYXIgYXMgbnVtZXJpYyB2YXJpYWJsZXMsIGJ1dCB0aGV5IGhvbGQgbWVhbmluZyBvZiBsYWJlbHMvbmFtZXMgb2YgZGF0YSBncm91cHMsIGkuZS4gbm9taW5hbCB2YXJpYWJsZS4gVGhlc2UgZGF0YSBncm91cHMgYXJlIHJlcHJlc2VudGVkIGluIGEgZm9ybSBvZiAnbGV2ZWxzJy4gIA0KSW4gb3VyIGNhc2UsIG91ciBtdWx0aXBsZSBjaG9pY2UgcXVlc3Rpb24gb3V0cHV0IHdpbGwgY29udGFpbiA0IGRhdGEgZ3JvdXBzICgnR3JvY2VyeSBTdG9yZScsICdPbmxpbmUgc2hvcCcsICdTcGVjaWFsaXNlZCBjb2ZmZWUgc2hvcCcsICdvdGhlcicpIGFmdGVyIGNvbnZlcnRpbmcgaXQgdG8gZmFjdG9yOg0KDQpgYGB7ciwgZXZhbD1UUlVFLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFfQ0KIyBEYXRhIGhhbmRsaW5nDQpxdWFsdHJpY3MkUTVfMltxdWFsdHJpY3MkUTVfMiA9PSAnMSddIDwtIDIgIyBTdWJzdGl0dWlvbiBvZiBhbGwgMSBpbiB3aXRoIDINCnF1YWx0cmljcyRRNV8zW3F1YWx0cmljcyRRNV8zID09ICcxJ10gPC0gMyAjIFN1YnN0aXR1aW9uIG9mIGFsbCAxIGluIHdpdGggMw0KcXVhbHRyaWNzJFE1XzRbcXVhbHRyaWNzJFE1XzQgPT0gJzEnXSA8LSA0ICMgU3Vic3RpdHVpb24gb2YgYWxsIDEgaW4gd2l0aCA0DQoNCiMgTWVsdGluZyA0IG91dHB1dCBjb2x1bW5zIHRvIG9uZSBjb2x1bW4NCmxpYnJhcnkocmVzaGFwZTIpDQpxdWFsdHJpY3NfbG9uZyA8LSBtZWx0KHF1YWx0cmljc1ssIGMoJ1E1XzEnLCdRNV8yJywnUTVfMycsJ1E1XzQnKV0sIG5hLnJtID0gVCkgDQoNCiMgQ29udmVydGluZyB2YWx1ZXMgZnJvbSAnbnVtZXJpYycgdG8gJ2ZhY3RvcicNCnF1YWx0cmljc19sb25nJHZhbHVlPC0gZmFjdG9yKHF1YWx0cmljc19sb25nJHZhbHVlLCBsZXZlbHMgPSBjKDE6NCksIGxhYmVscyA9IGMoJ0dyb2Nlcnkgc2hvcCcsJ09ubGluZSBzaG9wJywnU3BlY2lhbGl6ZWQgY29mZmVlIHNob3AnLCdPdGhlcicpKQ0KDQojIFRhYmxlDQp0YWJsZShxdWFsdHJpY3NfbG9uZyR2YWx1ZSkNCmBgYA0KDQojIyMjIFZpc3VhbGlzYXRpb24NCg0KU2Vjb25kLCB5b3UgbWlnaHQgd2FudCB0byB2aXN1YWxpemUgeW91ciByZXN1bHRzLiBJbiBvcmRlciB0byBkbyBzbywgdGhlIGRhdGEgZm9ybWF0IG5lZWRzIHRvIGJlIGluIHRoZSBhcHByb3ByaWF0ZSBmb3JtYXQuSGVyZSB3ZSBwcm9jZWVkIHdpdGggZGF0YSBmcm9tYXQgYWRhcHRhdGlvbiBmcm9tIHRoZSBwb2ludCB3aGVyZSB3ZSBzdG9wcGVkOg0KDQpgYGB7ciwgZXZhbD1UUlVFLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFfQ0KIyBDb252ZXJ0aW5nIGxvbmcgZm9ybWF0IHRvIHRoZSB2aXN1YWxpc2F0aW9uLWZyaWVuZGx5IGZvcm1hdA0KbWxjX3Zpc3VhbGlzYXRpb24gPC0gYXMuZGF0YS5mcmFtZSh0YWJsZShxdWFsdHJpY3NfbG9uZyR2YWx1ZSkpDQoNCiMgTmFtaW5nIGNvbHVtbnMNCm5hbWVzKG1sY192aXN1YWxpc2F0aW9uKSA8LSBjKCdQbGFjZScsJ0NvdW50JykNCg0KIyBPYnNlcnZpbmcNCm1sY192aXN1YWxpc2F0aW9uDQoNCmBgYA0KDQpUaGUgc2ltcGxpZXN0IHdheSB0byB2aXN1YWxpemUgZGF0YSBvYnRhaW5lZCBmcm9tIG11bHRpcGxlIGNob2ljZSBxdWVzdGlvbiB3aXRoIGEgc2luZ2xlIGFuc3dlciBpcyAqKmEgYmFyIGNoYXJ0Kio6DQpgYGB7cn0NCiMjIEJhc2ljIGJhciBjaGFydA0KbGFiZWxzIDwtIGFzLmNoYXJhY3RlcihtbGNfdmlzdWFsaXNhdGlvbiRQbGFjZSkgI1NhdmUgbGFiZWxzIGZvciB4LWF4aXMgaW4gdGhlIGJhcnBsb3QNCmJhcnBsb3QobWxjX3Zpc3VhbGlzYXRpb24kQ291bnQsICMgQ29sdW1uIHRvIHZpc3VhbGl6ZQ0KICAgICAgICB4bGFiPSdQbGFjZXMgdG8gYnV5IGNvZmZlZScsICMgWC1heGlzIGxhYmVsDQogICAgICAgIHlsYWIgPSAnQ291bnQoYW5zd2VycyknLCAjIFktYXhpcyBsYWJlbA0KICAgICAgICBuYW1lcy5hcmcgPSBsYWJlbHMsDQogICAgICAgIG1haW4gPSAnV2hlcmUgZG8geW91IGJ1eSB5b3VyIGNvZmZlZT8nKSAjIFRpdGxlDQpgYGANCg0KUiBwYWNrYWdlICoqZ2dwbG90MioqIGFsbG93cyB5b3UgdG8gY3JlYXRlIHZpc3VhbGx5IGFwcGVhbGluZyBncmFwaHM6DQoNCmBgYHtyfQ0KIyMgZ2dwbG90MiBiYXIgY2hhcnQNCmxpYnJhcnkoZ2dwbG90MikNCnAgPC0gZ2dwbG90KGRhdGE9bWxjX3Zpc3VhbGlzYXRpb24sIA0KICAgICAgICAgICAgIGFlcyh4PVBsYWNlLCB5PUNvdW50LCBmaWxsPVBsYWNlKSkgKw0KICAgICAgICAgICAgIGdlb21fYmFyKHN0YXQ9J2lkZW50aXR5JykgKyB0aGVtZV9taW5pbWFsKCkNCnANCmBgYA0KDQpBbm90aGVyIFIgbGlicmFyeSB3aGljaCBjYW4gaGVscCB5b3UgbWFrZSBhbWF6aW5nIGludGVyYWN0aXZlIGNoYXJ0cyBpbiBhIG1pbnV0ZSBpcyAqKnBsb3RseSoqLiBIZXJlIHdlIHVzZSBhIGZ1bmN0aW9uIGNhbGxlZCAqKmdncGxvdGx5KCkqKiwgd2hpY2ggYWxsb3dzIHlvdSB0byB0dXJuIGFueSAqKmdncGxvdDIqKiBjaGFydCBpbnRlcmFjdGl2ZS4gU2luY2Ugd2UgaGF2ZSBhbHJlYWR5IGNyZWF0ZWQgYSBiYXIgY2hhcnQgdXNpbmcgZ2dwbG90MiBhbmQgc2F2ZWQgaXQgYXMgInAiLCB3ZSB3aWxsIGp1c3QgdHVybiBpdCBpbnRvIHBsb3RseSBncmFwaDoNCg0KYGBge3Isd2FybmluZz1GLG1lc3NhZ2U9Rn0NCiMjIGdncGxvdGx5IGJhciBjaGFydA0KDQpsaWJyYXJ5KHBsb3RseSkNCmdncGxvdGx5KHApDQpgYGANCg0KDQpBbiBpbXByb3ZlZCB2ZXJzaW9uIG9mIGdncGxvdDIgcGFja2FnZSBpcyB0aGUgcGFja2FnZWQgY2FsbGVkICoqZ2d2aXMqKiwgd2hpY2ggaXMgc3RpbGwgaW4gZGV2ZWxvcGluZzoNCmBgYHtyLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFfQ0KIyMgZ2d2aXMgYmFyIGNoYXJ0DQoNCmxpYnJhcnkoZ2d2aXMpDQpnZ3ZpcyhtbGNfdmlzdWFsaXNhdGlvbiwgDQogICAgICB4ID0gflBsYWNlLCANCiAgICAgIHkgPSB+Q291bnQsIA0KICAgICAgZmlsbD1+UGxhY2UpDQpgYGANCg0KIyMjIyBTdGF0aXN0aWNhbCBhbmFseXNpcw==